希爾排序
(shell sort)又稱為「縮小增量排序」。該方法的基本思想是:先將整個待排元素序列
分割成若干個子串行
(由相隔某個「增量gap」的元素組成的)分別
進行直接插入排序
,然後依次
縮減增量
(最小為1時就變成直接插入排序),再進行排序,待整個序列中的元素
基本有序
(此排序可稱為預排序)(
增量足夠小)時,再對全體元素
進行一次直接插入排序
。因為直接插入排序在元素基本有序的情況下(接近有序最好情況),效率是很高的,因此希爾排序在時間效率上比前兩種方法有較大提高。
希爾排序是
基於插入排序
的以下兩點性質而提出改進方法的: 1)
插入排序在對
幾乎已經排好序
的資料操作時, 效率高, 即可以達到線性排序的效率 2)
插入排序一般來說是低效的, 因為插入排序每次只能將資料移動一位
3)在插入排序最壞情況下(與目標序列逆序),效率最低
步長「gap」的選擇是希爾排序的重要部分。只要最終步長為1任何步長序列都可以工作。
設待排序元素有n個,首先取乙個整數gap 例:
對進行公升序排列:
每次預排序後,數列接近有序,當步長gap為一時,也就相當於插入排序,整個數列就有序了
插入排序結果:
具體**實現:
void shellsort(int a,int n)//插入排序的變形,通過預排序使得元素大致有序,再通過插入排序使得陣列整體有序
a[pos + gap] = tmp;}}
}
分析:
for (
int
index = gap; index<
len;++index)
在這條語句中,以上面具的例子陣列為例,index
進行希爾排序的時候gap的選取很重要,它決定了排序效率的高低,一般最開始設定gap為要排序的元素的個數,接下來gap按照gap=gap/3+1的趨勢進行變化。希爾排序的平均時間複雜度是在n^1.25到1.6n^1.25的範圍內。
希爾排序與插入排序的比較:
插入排序在什麼情況下效率最高呢???
如果當要排序的序列大致上接近於有序的時候,插入排序的效率最高,基本上接近o(n)。因為當資料基本上接近於有序的時候,元素向有序區插入的時候比較的次數會很少,同樣有序區元素向後移動的次數也是很少的。
那麼插入排序在什麼情況下的效率最低呢???
如果當要排序的序列大致上接近於逆序的時候,插入排序的效率最低,基本上接近與o(n*n)。因為這時候每向有序區插入乙個元素的時候,假設最極端的情況下要比較和移動的次數就是有序區的長度。這時候插入排序的效率就會很低。
針對於插入排序的最壞的情況,希爾排序對它進行了優化,希爾排序先對這組資料進行預排序(就是gap不為1的時候進行的分組排序),通過預排序就能將這組資料快速的接近於有序,這時候再使用插入排序效率就會提公升上去。所以希爾排序的增量選擇就很重要,增量大額話會起不到預排序的效果,增量小的話效率又會降低。
如果當一組資料接近的有序的話,我們優先使用插入排序,效率高。如果當一組資料接近於逆序的話,我們使用希爾排序會更優。插入情況最好的情況就是希爾排序最壞的情況,因為這時候希爾排序的預排序起不到作用。插入排序最壞的情況則是希爾排序最高的情況,因為這時候預排序的效果是非常明顯的。
希爾排序(Shell Sort)
希爾排序 shell sort 又叫做縮小增量排序 diminishing increment sort 是一種很優秀的排序法,演算法本身不難理解,也很容易實現,而且它的速度很快。基本思想 先取乙個小於n的整數d1作為第乙個增量,把檔案的全部記錄分成d1個組。所有距離為dl的倍數的記錄放在同乙個組中...
希爾排序 shellsort
希爾排序 shellsort 又叫增量遞減 diminishing increment 排序,是由d.l.shell發明的,這個演算法是通過乙個逐漸減小的增量使乙個陣列逐漸趨近於有序從而達到排序的目的。假設有乙個陣列int data 16 首先將這個增量設為16 2 8,這樣就將這個陣列分成了8個子...
希爾排序(ShellSort)
希爾排序 shellsort cpp view plain copy include shellsort.h include print.h 希爾排序,分組進行插入排序,最後一步仍然是插入排序,但是因為之前的操作使逆序數減少,所以相對單純的插入排序效率高。void shellsort inta,in...