演算法 希爾排序

2021-08-11 15:27:07 字數 1353 閱讀 9161

基本概念:

希爾排序按其設計者希爾(donald shell)的名字命名,它是一種基於插入排序的快速排序演算法,要了解希爾排序,必須先掌握插入排序的原理與實現

。希爾排序通過將比較的全部元素分為幾個區域來提公升插入排序的效能。這樣可以讓乙個元素可以一次性地朝最終位置前進一大步。然後演算法再取越來越小的步長進行排序,演算法的最後一步就是普通的插入排序,但是到了這步,需排序的資料幾乎是已排好的了(此時插入排序較快)。

步長的選擇是希爾排序的重要部分。只要最終步長為1任何步長序列都可以工作(且步長要小於陣列長度)。演算法最開始以一定的步長進行排序。然後會繼續以一定步長進行排序,最終演算法以步長為1進行排序。當步長為1時,演算法變為插入排序,這就保證了資料一定會被排序。

關於希爾排序的時間複雜度,與步長息息相關:

過程如圖:

簡單例子分析:

待排序陣列:

第一次步長h=4,

那麼陣列按照步長可以拆分成4個小陣列([0]6的意思是下標[0]的值為6)

對這4個小陣列分別進行插入排序後,4個小陣列變成:

合併起來就是:

第二次步長h=1,

那麼陣列按照步長只有1個陣列了

對這個陣列進行一次插入排序後,最終順序就成為:

原始碼:[cpp]view plain

copy

#include 

void

shell_sort(

intarr, 

intsize)  

}  /* 每輪內迴圈後輸出陣列的現狀 */

intk;  

printf("the step=%d : "

, h);  

for(k = 0; k 

printf("\n"

);  

/* 計算下一輪步長 */

h = h / 3;  

}  }  

intmain()  

;  int

size = 

sizeof

(arr) / 

sizeof

(int

);  

//sort

shell_sort(arr, size);  

//print

inti = 0;  

for(i; i 

return

0;  

}  

排序演算法 希爾排序

如果乙個排序演算法,每次只把諸專案移動乙個位置,則它的平均執行時間至少要和n2成比例.因為在這個排序演算法執行的過程當中,每個記錄平均都必須遍歷n 3個位置,因此如果要對直接插入排序進行有效的,實質性的改進的話,就要有一種演算法,它可以使記錄做長距離的跳躍,而不是一步一步的挪動.希爾排序也是一種插入...

排序演算法 希爾排序

摘要 排序演算法有很多,最簡單的有氣泡排序和插入排序,這兩種方法都具有o n 2 的時間界.我們想要討論的是具有更好的時間界的排序演算法,比如希爾排序.1 希爾排序的思路是通過比較一定間距的元素來進行排序,最後再對所有相鄰元素進行一次插入排序.2 希爾排序最重要的引數是增量序列 h1,h2,ht 只...

排序演算法 希爾排序

希爾排序,也稱遞減增量排序演算法,是插入排序的一種更高效的改進版本。希爾排序是非穩定排序演算法。希爾排序通過將比較的全部元素分為幾個區域來提公升插入排序的效能。這樣可以讓乙個元素可以一次性地朝最終位置前進一大步。然後演算法再取越來越小的步長進行排序,演算法的最後一步就是普通的插入排序,但是到了這步,...