資料結構之排序演算法——希爾排序
**很多地方借鑑了 他的思想,
本人認為該作者已經寫的很好了,只是在他的基礎上加入了一些自己的理解和說明
維基百科:
參考部落格 :
希爾排序:其實就是分組的插入排序
希爾排序基本思想是:
在無序的陣列中定義乙個增量,然後用增量將陣列分成幾個部分,每個部分進行插入排序,然後減少增量的大小,繼續進行插入排序,直到最後增量為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組,分組情...