您好,登錄后才能下訂單哦!
插入排序分為:直接插入排序,二分插入排序(又稱折半插入排序),鏈表插入排序,希爾排序(又稱縮小增量排序)。屬于穩定排序的一種(通俗地講,就是兩個相等的數不會交換位置) 。
在這里我具體講直接插入排序和希爾排序。
直接排序插入
直接插入排序是由兩層嵌套循環組成的。外層循環標識并決定待比較的數值。內層循環為待比較數值確定其最終位置。直接插入排序是將待比較的數值與它的前一個數值進行比較,所以外層循環是從第二個數值開始的。當前一數值比待比較數值大的情況下繼續循環比較,直到找到比待比較數值小的并將待比較數值置入其后一位置,結束該次循環。
基本思想
待排序記錄 R1,R2,… ,Rn–1, Rn
第一步:R1
第二步:(R1 ), R2
第三步:(R1 , R2), R3
……
第 j 步:(R1,R2,… ,Rj–1), Rj
……
第 n 步: (R1,R2,… ,Rn–1), Rn.
正如以上圖片所示,直接排序總是先使前面一段有序,然后依次往后,知道整個數組都有序。
void InserSort(int * a,size_t size) //直接插入排序 { assert(a); for(int i = 1;i < size ; i++) { int tem = a[i]; int end = i - 1; while( end >= 0 && a[end]>tem) { a[end+1] = a[end]; --end; } a[end+1] = tem; } }
希爾排序
希爾排序(Shell Sort)是插入排序的一種。也稱縮小增量排序,是直接插入排序算法的一種更高效的改進版本。希爾排序是非穩定排序算法。該方法因DL.Shell于1959年提出而得名。
希爾排序是按照不同步長對元素進行插入排序,當剛開始元素很無序的時候,步長最大,所以插入排序的元素個數很少,速度很快;當元素基本有序了,步長很小,插入排序對于有序的序列效率很高。所以,希爾排序的時間復雜度會比o(n^2)好一些。
正如下圖
此處,我的步長是以3為例,由上便可以看出,步長包括了整個數組。
第一個是:2,9,8,1 --》1,2,8,9
第二個是:5,3,7 ——》 3,5,7
第三步是:4,6,1 -》 1,4,6
代碼如下
void ShellSort(int* a, size_t size) //希爾排序 { assert(a); int gap = size / 3; while(gap > 1) { gap = gap/3 + 1; //gap一直變小,知道它為1; for(int i = 0;i < (size - gap);++i) { int end = i; int tem = a[end + gap]; while( end >= 0 && a[end]>tem) { a[end+gap] = a[end]; end -= gap; } a[end+gap] = tem; } } }
希爾排序的特點是不需要大量的輔助空間,和歸并排序一樣容易實現。希爾排序是基于插入排序的一種算法, 在此算法基礎之上增加了一個新的特性,提高了效率。希爾排序沒有快速排序算法快 O(n(logn)),因此中等大小規模表現良好,對規模非常大的數據排序不是最優選擇。但是比O( N^2 )復雜度的算法快得多。并且希爾排序非常容易實現,算法代碼短而簡單。 此外,希爾算法在最壞的情況下和平均情況下執行效率相差不是很多,與此同時快速排序在最壞的情況下執行的效率會非常差。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。