排序是計算機程式設計中的一種重要的操作,它的功能是將乙個資料元素(或記錄)的任意序列,重新排列成乙個按關鍵字有序的序列。
由於待排序的記錄數量不同,使得排序過程中涉及的儲存器不同,可將排序方法分為兩大類:一類是內部排序,指的是待排序記錄存放在隨機儲存器中進行的排序過程;另一類是外部排序,指的是待排序記錄數量比較大,以至記憶體一次不能容納全部記錄,在排序過程中尚需對外存進行訪問的排序過程。下面主要討論內部排序。
通常,排序過程中需要進行兩種操作:一是比較兩個關鍵字的大小;二是要將記錄從乙個位置移動至另乙個位置。
1、插入排序演算法
1.1、直接插入排序:
直接插入排序是一種最簡單的排序方法,它的基本操作是將乙個記錄插入到乙個已排好序的有序表中,從而得到乙個新的、記錄數增
1的有序表。
下面是它的程式實現:
直接插入排序演算法簡單,且容易實現,它的時間複雜度是o(n2)。當待排序記錄的數量
n很小時,這是一種很好的演算法,但是當待排序序列中的記錄數量
n比較大時,則不宜採用直接插入排序。因此需要在直接插入排序的基礎上,從減少「比較」和「移動」這兩個操作的次數上,尋找改進的插入排序方法,比較有代表性的有折半插入排序和希爾排序演算法。
1.2、折半插入排序:
由於插入排序的基本操作是在乙個有序表中進行查詢和插入,因而,
這個「查詢」工作可用「折半查詢」(二分查詢)來實現,由此進行的插入排序稱之為折半插入排序。
折半插入排序所需要的附加儲存空間和直接插入排序相同,從時間上比較,折半插入排序僅減少了關鍵字間比較的次數,而記錄的移動次數不變,因此,折半插入排序的時間複雜度仍為o(n2)。
1.3、希爾排序:
希爾排序是一種改進的插入排序類演算法,又稱為「縮小增量排序」。直接插入排序演算法的時間複雜度是o(n2)
,但是,若待排序記錄序列為「正序」時,即不需要移動記錄,其時間複雜度可提高至
o(n)。因此可以設想,如果待排序記錄序列按關鍵字「基本有序」,那麼直接插入排序的效率就可以大大提高;從另一方面,由於直接插入排序演算法簡單,在
n值很小時效率也比較高。希爾排序正是從這兩點分析出發對直接插入排序進行改進得到的一種插入排序演算法。
希爾排序的基本思想是:先將整個待排序記錄序列分隔成若干子串行分別進行直接插入排序,待整個序列中的記錄「基本有序」時,在對全體記錄進行一次直接插入排序。
從上述排序過程可以看出,希爾排序有乙個特點:子串行的構成不是簡單的「逐段分隔」,而是將相隔某個「增量」的記錄組成乙個子串行。
排序演算法及演算法複雜度
演算法 演算法是指令的有限集合,順序執行這些指令,可以完成特定的任務。演算法具有以下特性 1 輸入 從外界獲取零個或多個量 2 輸出 產生至少乙個量 3 確定性 每條指令清晰 無二義性 4 有限性 演算法對所有情形都能在執行有限步之後結束 5 有效性 每條指令都是可執行的 選擇排序 工作原理 在未排...
各種排序演算法時間複雜度及空間複雜度
平均o n 2 最壞o n 2 最好o n 輔助記憶體o 1 穩定排序 最好情況是加了改進方法的最好 即冒泡的過程中檢查是否發生了交換,如果沒有發生交換,說明都排好序了,就break 插入 平均o n 2 最壞o n 2 最好o n 輔助記憶體o 1 穩定排序 直接選擇排序 平均o n 2 最壞o ...
演算法複雜度分析
分析非遞迴演算法效率的通用方案 1.決定用哪個 哪些 引數作為輸入規模的度量 2.找出演算法的基本操作 作為一規律,它總是位於演算法的最內層迴圈中 3.檢查基本操作的執行次數是否只依賴輸入規模。如果它還依賴一些其他的特性,則最差效率 平均效率以及最優效率 如果必要 需要分別研究。4.建立乙個演算法基...