開心IT面試題 希爾排序

2021-06-19 23:16:38 字數 984 閱讀 1304

1、基本思想

希爾排序又稱增量縮小排序,是對直接插入排序的一種改進,分組插入方法。

先將序列按增量劃分為元素個數相同的若干組,使用直接插入排序法進行排序,然後不斷縮小增量直至為1,最後使用直接插入排序完成排序。

2、假設待排序陣列為[2 6 1 5 3 8 9 4],增量取4、2和1

第一趟待排序陣列可分成以下四個虛擬組:2和3一組;6和8二組;1和8三組;5和4四組

並不是臨時的兩個數字分組,而是每隔4個數取乙個,每隔4個再取乙個,這樣取出來的數放到一組,把它們當成一組,但並不是實際分組,只是當成一組來看,所以「組」實際上並不存在,只是為了說明分組關係。

第二趟排序增量取2,可分成兩組。

第三趟排序增量取1,即每隔乙個取乙個組成新組,實際上就是直接插入排序演算法了。

3、選取增量注意事項

1)增量要越來越小,最後乙個增量必須為1;

2)應該盡量避免序列中的值(尤其是相鄰的值)互為倍數的情況。

3)建議取值規則:第一次取總長度的一半,第二次取一半的一半,依次類推直到1為止。

4、希爾排序演算法是一種不穩定的排序方法。

時間複雜度o(n^1.25),空間複雜度o(1)。

5、**

將elem陣列按遞增進行希爾排序

void subshellsort(int *elem, int elemlen, int increment)

while(j >= 0)

else

}elem[j+increment] = tempelem;

}}void shellsort(int *elem, int elemlen)

int increment = elemlen/2;

while(increment >= 1)

}



開心IT面試題 氣泡排序

1 基本思想 將陣列劃分為有序區和無序區,不斷通過交換將較大元素移至無序區尾。若在某一趟排序中未發生交換事件時,或無序區已全部排序完時,則排序完畢。2 最優情況 待排序陣列是正序 只用比較一次就行了。複雜度o n 最差情況 待排序陣列是逆序 要比較n 2次才行,複雜度o n 2 3 氣泡排序屬於穩定...

開心IT面試題 單鏈表排序 反轉

一 單鏈表排序 仿照基於陣列的氣泡排序演算法 node sorting linklist node node node result int temp 0 int len length linklist node result node for int j 0 j len j result resu...

開心IT面試題 直接插入排序

1 基本思想 將陣列分為無序區和有序區,依次將無序區的元素按大小順序插入到有序區中的適當位置,直到把無序區中元素全部移到有序區時排序完畢。第一趟比較前兩個數,然後把第二個數按大小插入到有序區中 第二趟把第三個數與前兩個數從後向前掃瞄,把第三個數按大小插入到有序表中 依次進行下去,進行了 n 1 趟掃...