前面說的三種排序,氣泡排序、選擇排序、快速排序都是交換排序,通過交換元素的位置進行排序。下面說的兩種排序都是插入排序,分別是插入排序和希爾排序;
插入排序
插入排序的原理是:
將第乙個元素標記為已排序遍歷每個沒有排序過的元素
「提取」 元素 x
i = 最後排序過元素的指數 到 0 的遍歷如果現在排序過的元素 > 提取的元素將排序過的元素向右移一格
否則:插入提取的元素
下面是插入排序的**示例:
**示例:
//插入排序
void
insertsort
(int *a, int len)
//插入操作
a[i +1]
= key;
}}
演算法分析:
外迴圈執行n-1次,這很明顯。
但內迴圈執行的次數取決於輸入:
1.在最好的情況下,陣列已經排序並且(a [j]> x)總是為假所以不需要移位資料,並且內部迴圈執行在o(1),
2.在最壞的情況下,陣列被反向排序並且(a [j]> x)始終為真插入始終發生在陣列的前端,並且內部迴圈以o(n)執行。
因此,最佳情況時間是o(n × 1) = o(n) ,最壞情況時間是o(n × n) = o(n²).
希爾排序
希爾排序是插入排序的改進,又稱「縮小增量排序」用gap作為增量,增量的初值一般為length/2,每迴圈一次除2直至gap<=1時停止迴圈;
下面為希爾排序的**;
**為:
//希爾排序
void
shellpass
(int *a, int len)
/*show(a, len);*/}}
}}
希爾排序演算法分析;
希爾排序的關鍵並不是隨便分組後各自排序,而是將相隔某個「增量」的記錄組成乙個字序列,實現跳躍式的移動,使得排序的效率提高。這的「增量」選取就非常關鍵了。我們採用的是length/2的方式選取。不過科學研究表明,當增量序列為dlta[k] = 2^(t-k+1) - 1,0 <=k<=t<=log2(n+1)時,可以獲得不錯的效率,其時間複雜度為o(n^(3/2)), 要好於o(n^2)。
希爾排序是不穩定的排序,他是人們最早的把排序演算法從o(n²)改進到現在的o(n㏒n)的演算法,還是有很大的學習意義的;
經典排序演算法(2) 插入排序演算法 希爾排序詳解
直接插入排序是一種最簡單的插入排序。插入排序 每一趟將乙個待排序的記錄,按照其關鍵字的大小插入到有序佇列的合適位置裡,直到全部插入完成。這個過程類似摸牌 假設有一組無序序列 r0,r1,rn 1。所以我們需要將 ri 和 r0 ri 1 進行比較,確定要插入的合適位置。這就需要乙個內部迴圈,我們一般...
排序演算法詳解
直接插入 二分插入 希爾排序 氣泡排序 快排 簡單選擇 堆排序 歸併排序 基數排序 總結 一 穩定性 穩定 氣泡排序 插入排序 歸併排序和基數排序 不穩定 選擇排序 快速排序 希爾排序 堆排序 二 平均時間複雜度 o n 2 直接插入排序,簡單選擇排序,氣泡排序。在資料規模較小時 9w內 直接插入排...
排序演算法詳解
排序演算法可以分為內部排序和外部排序,內部排序是資料記錄在記憶體中進行排序,而外部排序是因為排序的資料很大,一次不能容納全部的排序記錄,在排序過程中需要訪問外存.常見的內部排序演算法有 氣泡排序 選擇排序 插入排序 希爾排序 歸併排序 快速排序 堆排序等.介紹氣泡排序是一種簡單的排序演算法,這個演算...