shell排序本質也是一種插入排序,是先分組然後採用直接插入排序。因此也稱為縮小增量排序
2.1直接插入排序與希爾排序對比 :
前者時間複雜度o(n^2) 則100個資料需要10000次迴圈;
後者若分為10組:100個資料分為10組,每組先有序:
10 ^ 2 乘 10=1000次,再插入排序,而插入排序越有序越快,插入排序時時間複雜度小於o(n ^ 2),假設為o(n ^ t),(t<2)
而 1000+o(n ^ 2)< o(n ^ 2),因此希爾排序更快
2.2 原理
注意:①分n組,則每組有n個元素(每組元素算頭不算尾)
② 為什麼要選擇跳躍式分組?
順序分組並組內排序:
對比該結果與上面的跳躍分組排序可以看出跳躍分組並整體結果更加趨向有序
2.3**:
//組內插入排序
static void shellsort(int
*arr,
int len,
int gap)
else
} arr[j+gap]
=arr[j];}
void shellsort
(int
*arr,
int len)
;//每次分組數,稱為增量序列
for(
int i=
0;i<
sizeof
(d)/
sizeof(0
),i++
)return0;
}
2.4評價
2.4.1希爾排序的效率取決於分組數的選取,即增量序列的內容,目前沒有統一適用的增量序列規則,但是預設:
①增量序列中的值沒有除1以外的公因子,若有公因子例如分組為8組,4組,1組,分為4組中包含分8組的資料已經排序,會出現重複排序。
②最後的組數必須為1,才能保證整個序列全部有序
2.4.2時間複雜度,與增量序列有關,一般在o(n1.3)到o(n1.5)之間,比直接插入排序快
2.4.3 不穩定,有跳躍式排序
排序 2 希爾排序
我們來談一談希爾排序 希爾排序和直接插入排序一樣屬於插入排序,但是由於分組的存在,相等的元素可能分在不同組,導致他們的次序可能發生變化,所以它是不穩定的排序。除此之外由於它移動次數較少所以它比直接插入排序時間效能優越,效率更高。時間複雜度 最好情況 o n 最壞情況 o n2 平均情況 o n1.3...
排序2 希爾排序
希爾排序 shell sort 是改進後的插入排序,不同的是其設定乙個步長,將輸入按步長分組,對每組元素進行插入排序。然後減少步長,再次分組插入排序。直到步長變為1,也即對所有元素進行插入排序。一般來說,習慣於將初始步長設定為 n 2,然後每次減半,直至為1。乙個步長對應一趟分組排序。找到乙個特別好...
2 希爾排序
是對插入排序的改進,也叫作縮減增量排序。屬於原址排序。1 思路 先取乙個小於n 陣列長度 的整數d1作為第乙個增量,把檔案的全部記錄分成 n d1 個組。所有距離為d1的倍數的記錄放在同乙個組中。先在各組內進行直接插入排序 然後,取第二個增量d2 2 複雜度分析 2.1 時間複雜度 o o 1 3 ...