希爾排序總結

2022-08-24 12:57:09 字數 1116 閱讀 5909

資料結構之排序演算法——希爾排序

**很多地方借鑑了   他的思想,

本人認為該作者已經寫的很好了,只是在他的基礎上加入了一些自己的理解和說明

維基百科:

參考部落格 :

希爾排序:其實就是分組的插入排序

希爾排序基本思想是:

在無序的陣列中定義乙個增量,然後用增量將陣列分成幾個部分,每個部分進行插入排序,然後減少增量的大小,繼續進行插入排序,直到最後增量為1,進行最後的排序操作

我看到兩種增量的定義方式

第一種是 先將陣列的長度賦值3/1 +1給增量,然後讓增量等於自己的3/1 +1,保證每次增量的大小不小於 1,結束條件是增量不小於 1

注意: 使用這個方式一定要注意增量是永遠大於等於1 的,因此乙個好的處理方式是使用do {}while();

第二種是將陣列將陣列的長度除以2賦值給增量,然後讓增量等於自己的1/2 結束條件是增量小於1

其實增量的定義只是在分組的時候,確定每個組資料的規模,沒什麼需要去深究的!

利用第乙個增量方式的原始碼:

void shell_sort(int array, int arraylen)

array[k + incremental] = insertnum;}}

}} while (incremental > 1);

利用第二個增量方式的原始碼

void shell_sort(int array, int arraylen)

array[k + incremental] = insertnum;}}

}}針對第二種方案的一些優化:主要是對開始位置的優化,在插入排序中,每次查詢與前面的大小關係時都從已經有序的位置開始,在希爾排序的每個分組裡面我們也可以這樣認為,這樣,我們每次從增量開始,尋找增量和它前面的分組的數的關係,然後進行大小的調整

原始碼如下

void shell_sort(int array, int arraylen)

array[j + incremental] = insertnum;}}

}還可以進一步把第二次優化的的最後的乙個for(){}和下面的if()語句合併,然後用資料的移動來代替,查詢插入位置

原始碼:void shell_sort(int array, int arraylen)}}

排序演算法總結(四)希爾排序

希爾排序又稱縮小增量排序,是插入排序的一種。它的基本思想是先將整個待排記錄序列分割成若干個子串行,然後對這若干個子串行分別進行直接插入排序,等到待排序列基本有序時,再對整個序列進行直接插入排序。比如如下陣列,先已step 5進行分割。49,38,65,97,76,13,27,49,55,4 由於st...

排序方法總結(3) 希爾排序

希爾排序是對插入排序的改進,對中等規模的資料排序效率較高!交換的次數變得少了,效率就高了。希爾排序的演算法 1 相距為 k的資料進行比較,若不符合排序的條件,就進行交換。2 第一次比較時 k為陣列長度的一半,以後依次減半,直至 k為零,比較結束。下面是希爾排序實現的c 和c c include vo...

排序演算法總結 4 希爾排序

插入排序適合資料量較小或者部分有序的序列排序,但是當序列的最小值在最右端時,需要比較n 1次並且移動n 1次才能將最小數插入序列的最左端。希爾排序對直接插入排序做了改進。在插入排序的基礎上,將序列分組,利用了插入排序對資料量較小和部分有序序列高效的性質。希爾排序首先將序列以 增量 h分成h組,分組情...