章節(jié)五: 線性時間排序

前面介紹的幾種排序算法甥温,其排序結(jié)果中各元素的次序基于輸入元素間的比較,這類排序算法稱為比較排序赶舆。實驗證明:對含有n個元素的一個輸入序列踪栋,任何比較排序在最壞情況都要用O(nlgn)次比較來進行排序,故合并排序和堆排序是漸近最優(yōu)的(快排在平均情況下達到此上界)卧土。

接下來我們將討論三種以線性時間運行的算法(非比較排序惫皱,下界O(nlgn)不再適用):計數(shù)排序,基數(shù)排序和桶排序尤莺。

5.1 計數(shù)排序

計數(shù)排序假設n個輸入元素中的每一個都介于0到k之間的整數(shù)旅敷,此處k為某個整數(shù),其基本思想就是對每一個輸入元素x颤霎,確定出小于x的元素個數(shù)媳谁,就可以把x直接放在他最終輸出數(shù)組中的位置上涂滴。顯然其時間復雜度為O(k+n)。該算法另外還需要兩個數(shù)組:存放排序結(jié)果的B【0,...n-1】及提供臨時存儲區(qū)的C【0...k】韩脑。

//計數(shù)排序 ?PHP實現(xiàn)

function counting_sort($array=array(),$k){

? ? for ($i=0; $i <=$k ; $i++) {

? ? ? ? $count_arr[]=0;

? ? }

? ? foreach ($array as $value) {

? ? ? ? $count_arr[$value]++;

? ? }

? ? for ($i=1; $i <=$k ; $i++) {

? ? ? ? $count_arr[$i]+=$count_arr[$i-1];

? ? }

? ? for ($i=count($array)-1; $i>=0; $i--) {

? ? ? ? $result[$count_arr[$array[$i]]]=$array[$i];

? ? ? ? $count_arr[$array[$i]]--;

? ? }

?return ksort($result);

}

由于計數(shù)排序的時間性能為O(k+n)氢妈,故在實踐中,當k=O(n)時段多,我們常常采用計數(shù)排序首量,這樣其運行時間就為O(n);穩(wěn)定性排序(這一點很重要进苍,計數(shù)排序經(jīng)常作為基數(shù)排序的子過程)加缘。

5.2 基數(shù)排序

基數(shù)排序(radix sort)是一種用在老式穿卡機上的算法,代碼很直觀觉啊,假設長度為n的數(shù)組拣宏,每個元素都有d位數(shù)字,其中1是最低位杠人,第d位為是最高位勋乾。

基數(shù)排序 PHP實現(xiàn):

function getEachValOfNum($key){

? ? $divide=(int)$key;

? ? static $max_digits=1;? $digits=0;

? ?do {

? ? ? ? $arr_digits[]=$divide%10;

? ? ? ? $divide/=10;

? ? ? ? $digits++;

? ? } while ((int)$divide!=0);

? ? if ($max_digits<$digits) {

? ? ? ? $max_digits=$digits;

? ? }

return array('max_digits'=>$max_digits,'digits'=>$arr_digits);

}

function radix_sort($array){

? ? foreach ($array as $value) {

? ? ? ? $arr_digits=getEachValOfNum($value);

? ? ? ? $num_digits[$value]=$arr_digits['digits'];

? ? }

? ? $max_digits=$arr_digits['max_digits'];

//arr_pad 元素位數(shù)

? ? foreach ($num_digits as $key => $value) {

? ? ? ?if (count($value)!=$max_digits) {

? ? ? ? ? array_pad($num_digits[$key], $max_digits, 0);

? ? ? ?}

}

//先按數(shù)組低位再按高位排序 鍵值才是關(guān)鍵哇~~

$result=array_keys($num_digits);

for ($i=0; $i <$max_digits ; $i++) {

? ? foreach ($result as $value) {

? ? ? ? $sort_digit[$value]=$num_digits[$value][$i];

? ? }

? ? asort($sort_digit,SORT_NUMERIC);

? ? $result=array_keys($sort_digit);

}

return result;

}

給定n個d位數(shù),每一個位數(shù)有k中取值可能(對于十進制數(shù)k=10:0...9)嗡善,則基數(shù)排序算法可以在O(d(n+k))時間對這些數(shù)進行排序辑莫。

5.3 桶排序

當桶排序(bucket sort)的輸入符合均勻分布時,即可以以線性時間運行罩引。桶排序假設輸入由一個隨機過程產(chǎn)生各吨,該過程將元素均勻的分布在0-1上。其基本思想把區(qū)間【0袁铐,1)劃分成n個相同大小的子區(qū)間揭蜒,或稱桶。然后將n個輸入分布到各個桶中去剔桨,先將各個桶中數(shù)進行排序屉更,然后按次序把桶中的元素列出來即可。

即使輸入不符合均勻分布洒缀,但只要各個桶尺寸的平方和與總的元素數(shù)呈線性關(guān)系偶垮,桶排序依然可以以O(n)線性時間運行。

ps:個人感覺基數(shù)排序和桶排序具有先提假設條件帝洪,未屬主流(存在價值當然不容否定),故并桶排序未給出具體實現(xiàn)脚猾,只是總體闡述了原理思想流程葱峡。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市龙助,隨后出現(xiàn)的幾起案子砰奕,更是在濱河造成了極大的恐慌蛛芥,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,826評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件军援,死亡現(xiàn)場離奇詭異仅淑,居然都是意外死亡,警方通過查閱死者的電腦和手機胸哥,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,968評論 3 395
  • 文/潘曉璐 我一進店門涯竟,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人空厌,你說我怎么就攤上這事庐船。” “怎么了嘲更?”我有些...
    開封第一講書人閱讀 164,234評論 0 354
  • 文/不壞的土叔 我叫張陵筐钟,是天一觀的道長。 經(jīng)常有香客問我赋朦,道長篓冲,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,562評論 1 293
  • 正文 為了忘掉前任宠哄,我火速辦了婚禮壹将,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘琳拨。我一直安慰自己瞭恰,他們只是感情好,可當我...
    茶點故事閱讀 67,611評論 6 392
  • 文/花漫 我一把揭開白布狱庇。 她就那樣靜靜地躺著惊畏,像睡著了一般。 火紅的嫁衣襯著肌膚如雪密任。 梳的紋絲不亂的頭發(fā)上颜启,一...
    開封第一講書人閱讀 51,482評論 1 302
  • 那天,我揣著相機與錄音浪讳,去河邊找鬼缰盏。 笑死,一個胖子當著我的面吹牛淹遵,可吹牛的內(nèi)容都是我干的口猜。 我是一名探鬼主播,決...
    沈念sama閱讀 40,271評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼透揣,長吁一口氣:“原來是場噩夢啊……” “哼济炎!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起辐真,我...
    開封第一講書人閱讀 39,166評論 0 276
  • 序言:老撾萬榮一對情侶失蹤须尚,失蹤者是張志新(化名)和其女友劉穎崖堤,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體耐床,經(jīng)...
    沈念sama閱讀 45,608評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡密幔,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,814評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了撩轰。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片胯甩。...
    茶點故事閱讀 39,926評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖钧敞,靈堂內(nèi)的尸體忽然破棺而出蜡豹,到底是詐尸還是另有隱情,我是刑警寧澤溉苛,帶...
    沈念sama閱讀 35,644評論 5 346
  • 正文 年R本政府宣布镜廉,位于F島的核電站,受9級特大地震影響愚战,放射性物質(zhì)發(fā)生泄漏娇唯。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,249評論 3 329
  • 文/蒙蒙 一寂玲、第九天 我趴在偏房一處隱蔽的房頂上張望塔插。 院中可真熱鬧,春花似錦拓哟、人聲如沸想许。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,866評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽流纹。三九已至,卻和暖如春违诗,著一層夾襖步出監(jiān)牢的瞬間漱凝,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,991評論 1 269
  • 我被黑心中介騙來泰國打工诸迟, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留茸炒,地道東北人。 一個月前我還...
    沈念sama閱讀 48,063評論 3 370
  • 正文 我出身青樓阵苇,卻偏偏與公主長得像壁公,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子绅项,可洞房花燭夜當晚...
    茶點故事閱讀 44,871評論 2 354

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

  • 背景 一年多以前我在知乎上答了有關(guān)LeetCode的問題, 分享了一些自己做題目的經(jīng)驗贮尖。 張土汪:刷leetcod...
    土汪閱讀 12,744評論 0 33
  • 某次二面時,面試官問起Js排序問題趁怔,吾絞盡腦汁回答了幾種湿硝,深感算法有很大的問題,所以總計一下润努! 排序算法說明 (1...
    流浪的先知閱讀 1,192評論 0 4
  • 借這個年份做標題是因為剛剛看完林德祿的《應召女郎1988》关斜。我對電影也沒有什么研究,總覺得看完有感觸的有想法的說起...
    杜若思閱讀 439評論 0 0
  • 剛來支教的某一天铺浇,一大早去后院鍛煉痢畜,忽然聽到空無一人的大操場上傳來嘹亮清揚的男高音:“一棵小白楊,長在哨所旁……”...
    小薔1982閱讀 310評論 0 1
  • 原定是將此文章發(fā)在朋友圈上以示說明自己的轉(zhuǎn)型情況鳍侣,可寫完卻發(fā)現(xiàn)其實是自己寫給自己的丁稀,是自己給自己一個交代而已。倚聚。线衫。...
    一段江湖傳說閱讀 544評論 0 4