希爾排序本質上是一種插入排序,但是對數列進行了等間隔分組處理,在每一組中做插入排序,這一優化使得原本 o(n^2) 的時間複雜度一下降為 o(nlogn)。
基本思想
希爾排序是按一定的間隔對數列進行分組,然後在每乙個分組中做插入排序;隨後逐次縮小間隔,在每乙個分組中做插入排序...直到間隔等於1,做一次插入排序後結束。
那麼問題來了,間隔應該取多大,怎麼縮小?通常我們去取初始間隔為數列長度的一半:gap = length/2,以 gap = gap/2 的方式縮小,下面詳細**整個過程。
原始陣列陣列如下:
首先取間隔為 gap = length/2 = 4,將陣列分為如下的4組,對每一組實施插入排序:
第一次排序,每一組較小的元素都移到了相對靠前的位置(這個狀態可以叫 n-sorted,即以n為gap分組有序),可以想象相對有序的陣列可能更有利於後面的排序。接著繼續分組,gap = gap/2 = 2,對每一組實施插入排序:
繼續對陣列分組,gap = gap/2 = 1,即所有元素組成一組,做插入排序完成演算法:
**實現
內層迴圈使用的插入排序與普通的插入排序基本一致,只是每次移動的步長變為 gap 而不是 1:
// shellsort
function shellsort(arr) {
for(let gap = math.floor(arr.length/2); gap > 0; gap = math.floor(gap/2)) {
// 內層迴圈與插入排序的寫法基本一致,只是每次移動的步長變為 gap
for(let i = gap; i < arr.length; i++) {
let j = i;
let temp = arr[j];
for(; j> 0; j -= gap) {
if(temp >= arr[j-gap]) {
break;
arr[j] = arr[j-gap];
arr[j] = temp;
return arr;
// example
let arr = [2,5,10,7,10,32,90,9,11,1,0,10];
alert(shellsort(arr));
希爾排序python 簡書 入門演算法 希爾排序
上手難度 演算法複雜度 o n 1.3 2 shell.gif 排序思想 最開始以整個陣列長度的一半作為步長gap進行分組 例如8個元素,索引0和索引4一組,索引1和索引5一組,索引2和索引6一組,索引3和索引7一組,分別對分好的組使用插入排序進行排序,這樣就得到了4個已經排好序的四組資料,再對步長...
希爾排序python 簡書 資料結構 排序
資料結構 排序 直接插入排序 希爾排序 其實主要是為了講述希爾排序,不過插入排序是希爾排序的基礎,因此先來講直接插入排序。一 直接插入排序 1 原理 下標tmp 假設陣列為a,i為當前元素下標,則a i 為當前元素的值 從下標i 2開始迴圈,與自己之前的元素比較大小 預設自己之前的序列已經是有序 公...
Python 希爾排序
coding utf 8 希爾排序 def shellsort list list 4,1,9,13,34,26,10,7,4,3 m len list 元素數目 gap m 2 gap 5,2,1.while gap 0 print gap 列表中的list i 按間隔gap從列表中取元素list...