排序算法-7---希爾排序

排序算法-7---希爾排序

概念

希爾排序(Shellsort)蒸殿,也稱遞減增量排序算法,是一種典型的插入排序算法,通過對原始序列進行分組進行排序终畅。希爾排序是非穩(wěn)定排序算法籍胯。

解題思路

希爾排序是基于插入排序的以下兩點性質(zhì)而提出改進方法的:

  • 插入排序在對幾乎已經(jīng)排好序的數(shù)據(jù)操作時,效率高离福,即可以達到線性排序的效率
  • 但插入排序一般來說是低效的杖狼,因為插入排序每次只能將數(shù)據(jù)移動一位

希爾排序的基本思想就是:先將整個待排序的記錄序列分割成為若干子序列分別進行直接插入排序,待整個序列中的記錄“基本有序”時妖爷,再對全體記錄進行依次直接插入排序蝶涩。

矩陣的列數(shù)取決于步長序列(step sequence)
比如,如果步長序列為{1,5,19,41,109...}.. 就代表依次分成109列絮识、41列绿聘、 19列、 5列次舌、1列進行排序
不同的步長序列熄攘,執(zhí)行效率也不同

運行過程

1、選擇一個增量序列t1彼念,t2鲜屏,…,tk国拇,其中對于i>j洛史,有ti>tj,tk=1酱吝;(增量因子有多種取法也殖,最簡單的是t(i+1) = ti/2)
2、按增量序列個數(shù)k务热,對序列進行k 趟排序忆嗜;
3)每趟排序,根據(jù)對應(yīng)的增量ti崎岂,將待排序列分割成若干長度為m 的子序列捆毫,分別對各子表進行直接插入排序。僅增量因子為1 時冲甘,整個序列作為一個表來處理绩卤,表長度即為整個序列的長度。

  • 例如:
    希爾本人給出的步長序列是n/2k, 比如n為16時江醇,步長序列是{1, 2, 4, 8}


    image

代碼

java

public void shell_sort(int[] arr) {
    int gap = 1, i, j, len = arr.length;
    int temp;
    while (gap < len / 3)
        gap = gap * 3 + 1;
    for (; gap > 0; gap /= 3)
        for (i = gap; i < len; i++) {
            temp = arr[i];
            for (j = i - gap; j >= 0 && arr[j] > temp; j -= gap)
                arr[j + gap] = arr[j];
            arr[j + gap] = temp;
        }
}

性能

  • 時間復(fù)雜度

**希爾排序的執(zhí)行時間依賴于增量序列濒憋。 **
希爾排序耗時的操作有:比較 + 后移賦值。

時間復(fù)雜度情況如下:(n指待排序序列長度)

  1. 最好情況:序列是正序排列陶夜,在這種情況下凛驮,需要進行的比較操作需(n-1)次。后移賦值操作為0次条辟。即O(n)
  2. 最壞情況:O(nlog2n)黔夭。
  3. 漸進時間復(fù)雜度(平均時間復(fù)雜度):O(nlog2n)

希爾排序是按照不同步長對元素進行插入排序宏胯,當(dāng)剛開始元素很無序的時候,步長最大本姥,所以插入排序的元素個數(shù)很少胳嘲,速度很快;當(dāng)元素基本有序了扣草,步長很小了牛,插入排序?qū)τ谟行虻男蛄行屎芨摺K猿矫睿柵判虻臅r間復(fù)雜度會比O(n2)好一些鹰祸。
希爾算法的性能與所選取的增量(分組長度)序列有很大關(guān)系。只對特定的待排序記錄序列密浑,可以準(zhǔn)確地估算比較次數(shù)和移動次數(shù)蛙婴。想要弄清比較次數(shù)和記錄移動次數(shù)與增量選擇之間的關(guān)系,并給出完整的數(shù)學(xué)分析尔破,至今仍然是數(shù)學(xué)難題街图。

希爾算法在最壞的情況下和平均情況下執(zhí)行效率相差不是很多,與此同時快速排序在最壞的情況下執(zhí)行的效率會非常差懒构。希爾排序沒有快速排序算法快餐济,因此中等大小規(guī)模表現(xiàn)良好,對規(guī)模非常大的數(shù)據(jù)排序不是最優(yōu)選擇胆剧。
(注:專家們提倡絮姆,幾乎任何排序工作在開始時都可以用希爾排序,若在實際使用中證明它不夠快秩霍,再改成快速排序這樣更高級的排序算法篙悯。)

  • 性能分析(穩(wěn)定性)

由于多次插入排序,我們知道一次插入排序是穩(wěn)定的铃绒,不會改變相同元素的相對順序鸽照,但在不同的插入排序過程中,相同的元素可能在各自的插入排序中移動颠悬,最后其穩(wěn)定性就會被打亂矮燎,所以希爾排序是不穩(wěn)定的。

備注:希爾排序的時間性能優(yōu)于直接插入排序

參考文章

經(jīng)典排序算法(5)——希爾排序算法詳解

排序:希爾排序(算法)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末椿疗,一起剝皮案震驚了整個濱河市漏峰,隨后出現(xiàn)的幾起案子糠悼,更是在濱河造成了極大的恐慌届榄,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,386評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件倔喂,死亡現(xiàn)場離奇詭異铝条,居然都是意外死亡靖苇,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,142評論 3 394
  • 文/潘曉璐 我一進店門班缰,熙熙樓的掌柜王于貴愁眉苦臉地迎上來贤壁,“玉大人,你說我怎么就攤上這事埠忘∑⒉穑” “怎么了?”我有些...
    開封第一講書人閱讀 164,704評論 0 353
  • 文/不壞的土叔 我叫張陵莹妒,是天一觀的道長名船。 經(jīng)常有香客問我,道長旨怠,這世上最難降的妖魔是什么渠驼? 我笑而不...
    開封第一講書人閱讀 58,702評論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮鉴腻,結(jié)果婚禮上迷扇,老公的妹妹穿的比我還像新娘。我一直安慰自己爽哎,他們只是感情好蜓席,可當(dāng)我...
    茶點故事閱讀 67,716評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著课锌,像睡著了一般瓮床。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上产镐,一...
    開封第一講書人閱讀 51,573評論 1 305
  • 那天隘庄,我揣著相機與錄音,去河邊找鬼癣亚。 笑死丑掺,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的述雾。 我是一名探鬼主播街州,決...
    沈念sama閱讀 40,314評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼玻孟!你這毒婦竟也來了唆缴?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,230評論 0 276
  • 序言:老撾萬榮一對情侶失蹤黍翎,失蹤者是張志新(化名)和其女友劉穎面徽,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,680評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡趟紊,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,873評論 3 336
  • 正文 我和宋清朗相戀三年氮双,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片霎匈。...
    茶點故事閱讀 39,991評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡戴差,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出铛嘱,到底是詐尸還是另有隱情暖释,我是刑警寧澤,帶...
    沈念sama閱讀 35,706評論 5 346
  • 正文 年R本政府宣布墨吓,位于F島的核電站饭入,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏肛真。R本人自食惡果不足惜谐丢,卻給世界環(huán)境...
    茶點故事閱讀 41,329評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望蚓让。 院中可真熱鬧乾忱,春花似錦、人聲如沸历极。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,910評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽趟卸。三九已至蹄葱,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間锄列,已是汗流浹背图云。 一陣腳步聲響...
    開封第一講書人閱讀 33,038評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留邻邮,地道東北人竣况。 一個月前我還...
    沈念sama閱讀 48,158評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像筒严,于是被迫代替她去往敵國和親丹泉。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,941評論 2 355