PHP算法系列教程(二)-希爾排序

希爾排序

基本概念

希爾排序(Shell's Sort)是插入排序的一種又稱“縮小增量排序”(Diminishing Increment Sort)涌矢,是直接插入排序算法的一種更高效的改進版本熄云。希爾排序是非穩(wěn)定排序算法.
希爾排序是把記錄按下標的一定增量分組刁愿,對每組使用直接插入排序算法排序;隨著增量逐漸減少咱枉,每組包含的關(guān)鍵詞越來越多玛臂,當增量減至1時,整個文件恰被分成一組辕近,算法便終止.

人話(圖解shell排序)

  1. 數(shù)據(jù)源[8,3,6,7,4,9,2,5]
  2. 初始增量gap=length/2=4


    1.jpg

數(shù)組被分為四組[8,4], [3,9],[6,2],[7,5],組內(nèi)比較排序結(jié)果為
[4,8], [3,9],[2,6],[5,7]結(jié)果集為[4,3,2,5,8,9,6,7]

  1. 縮小增量gap=gap/2=2


    2.jpg

數(shù)組被分會兩組[4,2,8,6],[3,5,9,7]組內(nèi)排序
[2,4,6,8],[3,5,7,9]結(jié)果集為[2,3,4,5,6,7,8,9] (巧合已經(jīng)有序,增量大于1,需要繼續(xù)縮小增量)

  1. 重復(fù)第二步gap=gap/2=1


    3.jpg

數(shù)組被分為一組[2,3,4,5,6,7,8,9],組內(nèi)排序[2,3,4,5,6,7,8,9],由于增量已經(jīng)到達1,停止縮小增量輸出結(jié)果集[2,3,4,5,6,7,8,9]

代碼示例

Talk is cheap, show you my code!

<?php

/**
 * 希爾排序
 * @param array $arr
 * @return array
 */
function shellSort(array $arr)
{
    for ($gap = floor(count($arr) / 2); $gap > 0; $gap = floor($gap / 2)) { // 縮小增量
        for ($i = $gap; $i < count($arr); $i++) { // 組內(nèi)循環(huán)排序
            $j = $i;
            while ($j - $gap >= 0 && $arr[$j] < $arr[$j - $gap]) { //完成組內(nèi)元素一次排序
                swap($arr, $j, $j - $gap);
                $j -= $gap;
            }
        }
        echo implode(',', $arr) . PHP_EOL; // 完成一次增量輸出一次結(jié)果
    }
    return $arr;
}

/**
 * 交換函數(shù)
 * @param array $arr
 * @param int $a
 * @param int $b
 */
function swap(array &$arr, int $a, int $b)
{
    $temp = $arr[$a];
    $arr[$a] = $arr[$b];
    $arr[$b] = $temp;
}
shellSort([8,3,6,7,4,9,2,5]);

結(jié)論

希爾排序的時間復(fù)雜度取決于初始增量的選取,本文所選去的初始增量方式時間復(fù)雜度為O(nlog2n)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末韵吨,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子移宅,更是在濱河造成了極大的恐慌学赛,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,277評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件吞杭,死亡現(xiàn)場離奇詭異盏浇,居然都是意外死亡,警方通過查閱死者的電腦和手機芽狗,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評論 3 393
  • 文/潘曉璐 我一進店門绢掰,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人童擎,你說我怎么就攤上這事滴劲。” “怎么了顾复?”我有些...
    開封第一講書人閱讀 163,624評論 0 353
  • 文/不壞的土叔 我叫張陵班挖,是天一觀的道長。 經(jīng)常有香客問我芯砸,道長萧芙,這世上最難降的妖魔是什么给梅? 我笑而不...
    開封第一講書人閱讀 58,356評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮双揪,結(jié)果婚禮上动羽,老公的妹妹穿的比我還像新娘。我一直安慰自己渔期,他們只是感情好运吓,可當我...
    茶點故事閱讀 67,402評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著疯趟,像睡著了一般拘哨。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上信峻,一...
    開封第一講書人閱讀 51,292評論 1 301
  • 那天倦青,我揣著相機與錄音,去河邊找鬼站欺。 笑死姨夹,一個胖子當著我的面吹牛纤垂,可吹牛的內(nèi)容都是我干的矾策。 我是一名探鬼主播,決...
    沈念sama閱讀 40,135評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼峭沦,長吁一口氣:“原來是場噩夢啊……” “哼贾虽!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起吼鱼,我...
    開封第一講書人閱讀 38,992評論 0 275
  • 序言:老撾萬榮一對情侶失蹤蓬豁,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后菇肃,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體地粪,經(jīng)...
    沈念sama閱讀 45,429評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,636評論 3 334
  • 正文 我和宋清朗相戀三年琐谤,在試婚紗的時候發(fā)現(xiàn)自己被綠了蟆技。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,785評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡斗忌,死狀恐怖质礼,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情织阳,我是刑警寧澤眶蕉,帶...
    沈念sama閱讀 35,492評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站唧躲,受9級特大地震影響造挽,放射性物質(zhì)發(fā)生泄漏碱璃。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,092評論 3 328
  • 文/蒙蒙 一刽宪、第九天 我趴在偏房一處隱蔽的房頂上張望厘贼。 院中可真熱鬧,春花似錦圣拄、人聲如沸嘴秸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽岳掐。三九已至,卻和暖如春饭耳,著一層夾襖步出監(jiān)牢的瞬間串述,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評論 1 269
  • 我被黑心中介騙來泰國打工寞肖, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留纲酗,地道東北人。 一個月前我還...
    沈念sama閱讀 47,891評論 2 370
  • 正文 我出身青樓新蟆,卻偏偏與公主長得像觅赊,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子琼稻,可洞房花燭夜當晚...
    茶點故事閱讀 44,713評論 2 354

推薦閱讀更多精彩內(nèi)容

  • 轉(zhuǎn)載自:https://egoistk.github.io/2016/09/10/Java%E6%8E%92%E5...
    chad_it閱讀 987評論 0 18
  • 排序算法 冒泡排序 選擇排序 插入排序 快速排序(最常見) 希爾排序 歸并排序 源碼:Sorting 冒泡排序 冒...
    廖少少閱讀 2,722評論 12 101
  • 體育比賽總是給人意想不到的結(jié)果吮螺,有的是意外驚喜,有的總感覺志在必得卻擦肩而過帕翻,有的讓人終身難忘鸠补,有的人會喜極而泣,...
    百合花白閱讀 528評論 0 0
  • 貓叔是一個特別有正能量的人嘀掸,對于他的高度評價紫岩,我已經(jīng)詞窮了。 他是我唯一一直關(guān)注的公眾號睬塌,他的晨讀我也是一...
    葉樣悠閱讀 304評論 2 4
  • 煙雨一生泉蝌,紅顏一世,一曲紅塵衫仑,終醉于此
    LuCkyAlLurELoVe閱讀 146評論 0 0