首先砸彬,排序算法的穩(wěn)定性大家應該都知道,通俗地講就是能保證排序前2個相等的數(shù)其在序列的前后位置順序和排序后它們兩個的前后位置順序相同。在簡單形式化一下扼褪,如果Ai = Aj想幻,Ai原來在位置前,排序后Ai還是要在Aj位置前话浇。
其次脏毯,說一下穩(wěn)定性的好處。排序算法如果是穩(wěn)定的幔崖,那么從一個鍵上排序食店,然后再從另一個鍵上排序,第一個鍵排序的結(jié)果可以為第二個鍵排序所用赏寇〖郏基數(shù)排序就是這樣,先按低位排序嗅定,逐次按高位排序自娩,低位相同的元素其順序再高位也相同時是不會改變的。另外渠退,如果排序算法穩(wěn)定忙迁,對基于比較的排序算法而言,元素交換的次數(shù)可能會少一些(個人感覺碎乃,沒有證實)姊扔。
回到主題,現(xiàn)在分析一下常見的排序算法的穩(wěn)定性荠锭,每個都給出簡單的理由旱眯。
(1)冒泡排序
冒泡排序就是把小的元素往前調(diào)或者把大的元素往后調(diào)。比較是相鄰的兩個元素比較证九,交換也發(fā)生在這兩個元素之間删豺。所以,如果兩個元素相等愧怜,我想你是不會再無聊地把他們倆交換一下的呀页;如果兩個相等的元素沒有相鄰,那么即使通過前面的兩兩交換把兩個相鄰起來拥坛,這時候也不會交換蓬蝶,所以相同元素的前后順序并沒有改變,所以冒泡排序是一種穩(wěn)定排序算法猜惋。
(2)選擇排序
選擇排序是給每個位置選擇當前元素最小的丸氛,比如給第一個位置選擇最小的,在剩余元素里面給第二個元素選擇第二小的著摔,依次類推缓窜,直到第n - 1個元素,第n個元素不用選擇了,因為只剩下它一個最大的元素了禾锤。那么私股,在一趟選擇,如果當前元素比一個元素小恩掷,而該小的元素又出現(xiàn)在一個和當前元素相等的元素后面倡鲸,那么交換后穩(wěn)定性就被破壞了。比較拗口黄娘,舉個例子峭状,序列5 8 5 2 9,我們知道第一遍選擇第1個元素5會和2交換寸宏,那么原序列中2個5的相對前后順序就被破壞了宁炫,所以選擇排序不是一個穩(wěn)定的排序算法偿曙。
(3)插入排序
插入排序是在一個已經(jīng)有序的小序列的基礎上氮凝,一次插入一個元素。當然望忆,剛開始這個有序的小序列只有1個元素罩阵,就是第一個元素。比較是從有序序列的末尾開始启摄,也就是想要插入的元素和已經(jīng)有序的最大者開始比起稿壁,如果比它大則直接插入在其后面,否則一直往前找直到找到它該插入的位置歉备。如果碰見一個和插入元素相等的傅是,那么插入元素把想插入的元素放在相等元素的后面。所以蕾羊,相等元素的前后順序沒有改變喧笔,從原無序序列出去的順序就是排好序后的順序,所以插入排序是穩(wěn)定的龟再。
(4)快速排序
快速排序有兩個方向书闸,左邊的i下標一直往右走,當a[i] <= a[center_index]利凑,其中center_index是中樞元素的數(shù)組下標浆劲,一般取為數(shù)組第0個元素。而右邊的j下標一直往左走哀澈,當a[j] > a[center_index]牌借。如果i和j都走不動了,i <= j割按,交換a[i]和a[j],重復上面的過程膨报,直到i > j。 交換a[j]和a[center_index],完成一趟快速排序丙躏。在中樞元素和a[j]交換的時候择示,很有可能把前面的元素的穩(wěn)定性打亂,比如序列為5 3 3 4 3 8 9 10 11晒旅,現(xiàn)在中樞元素5和3(第5個元素栅盲,下標從1開始計)交換就會把元素3的穩(wěn)定性打亂,所以快速排序是一個不穩(wěn)定的排序算法废恋,不穩(wěn)定發(fā)生在中樞元素和a[j] 交換的時刻谈秫。
(5)歸并排序
歸并排序是把序列遞歸地分成短序列,遞歸出口是短序列只有1個元素(認為直接有序)或者2個序列(1次比較和交換)鱼鼓,然后把各個有序的段序列合并成一個有序的長序列拟烫,不斷合并直到原序列全部排好序∑荆可以發(fā)現(xiàn)硕淑,在1個或2個元素時,1個元素不會交換嘉赎,2個元素如果大小相等也沒有人故意交換置媳,這不會破壞穩(wěn)定性。那么公条,在短的有序序列合并的過程中拇囊,穩(wěn)定是是否受到破壞?沒有靶橱,合并過程中我們可以保證如果兩個當前元素相等時寥袭,我們把處在前面的序列的元素保存在結(jié)果序列的前面,這樣就保證了穩(wěn)定性关霸。所以传黄,歸并排序也是穩(wěn)定的排序算法。
(6)基數(shù)排序
基數(shù)排序是按照低位先排序谒拴,然后收集尝江;再按照高位排序,然后再收集英上;依次類推炭序,直到最高位。有時候有些屬性是有優(yōu)先級順序的苍日,先按低優(yōu)先級排序惭聂,再按高優(yōu)先級排序,最后的次序就是高優(yōu)先級高的在前相恃,高優(yōu)先級相同的低優(yōu)先級高的在前辜纲。基數(shù)排序基于分別排序,分別收集耕腾,所以其是穩(wěn)定的排序算法见剩。
(7)希爾排序(shell)
希爾排序是按照不同步長對元素進行插入排序,當剛開始元素很無序的時候扫俺,步長最大苍苞,所以插入排序的元素個數(shù)很少,速度很快狼纬;當元素基本有序了羹呵,步長很小, 插入排序?qū)τ谟行虻男蛄行屎芨吡屏稹K愿曰叮柵判虻臅r間復雜度會比O(n^2)好一些。由于多次插入排序盈简,我們知道一次插入排序是穩(wěn)定的凑耻,不會改變相同元素的相對順序,但在不同的插入排序過程中送火,相同的元素可能在各自的插入排序中移動拳话,最后其穩(wěn)定性就會被打亂先匪,所以shell排序是不穩(wěn)定的种吸。
(8)堆排序
我們知道堆的結(jié)構(gòu)是節(jié)點i的孩子為2 * i和2 * i + 1節(jié)點,大頂堆要求父節(jié)點大于等于其2個子節(jié)點呀非,小頂堆要求父節(jié)點小于等于其2個子節(jié)點坚俗。在一個長為n 的序列,堆排序的過程是從第n / 2開始和其子節(jié)點共3個值選擇最大(大頂堆)或者最邪度埂(小頂堆)猖败,這3個元素之間的選擇當然不會破壞穩(wěn)定性。但當為n / 2 - 1降允, n / 2 - 2恩闻, ... 1這些個父節(jié)點選擇元素時,就會破壞穩(wěn)定性剧董。有可能第n / 2個父節(jié)點交換把后面一個元素交換過去了幢尚,而第n / 2 - 1個父節(jié)點把后面一個相同的元素沒 有交換,那么這2個相同的元素之間的穩(wěn)定性就被破壞了翅楼。所以尉剩,堆排序不是穩(wěn)定的排序算法。
綜上毅臊,得出結(jié)論: 選擇排序理茎、快速排序、希爾排序、堆排序不是穩(wěn)定的排序算法皂林,而冒泡排序朗鸠、插入排序、歸并排序和基數(shù)排序是穩(wěn)定的排序算法
排序
最后編輯于 :
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
- 文/潘曉璐 我一進店門浦辨,熙熙樓的掌柜王于貴愁眉苦臉地迎上來蹬竖,“玉大人,你說我怎么就攤上這事流酬”也蓿” “怎么了?”我有些...
- 文/不壞的土叔 我叫張陵芽腾,是天一觀的道長旦装。 經(jīng)常有香客問我,道長摊滔,這世上最難降的妖魔是什么阴绢? 我笑而不...
- 正文 為了忘掉前任,我火速辦了婚禮艰躺,結(jié)果婚禮上呻袭,老公的妹妹穿的比我還像新娘。我一直安慰自己腺兴,他們只是感情好左电,可當我...
- 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著页响,像睡著了一般篓足。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上拘泞,一...
- 文/蒼蘭香墨 我猛地睜開眼参滴,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了锻弓?” 一聲冷哼從身側(cè)響起砾赔,我...
- 正文 年R本政府宣布丽已,位于F島的核電站蚌堵,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏促脉。R本人自食惡果不足惜辰斋,卻給世界環(huán)境...
- 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望瘸味。 院中可真熱鬧,春花似錦够挂、人聲如沸旁仿。這莊子的主人今日做“春日...
- 文/蒼蘭香墨 我抬頭看了看天上的太陽枯冈。三九已至,卻和暖如春办悟,著一層夾襖步出監(jiān)牢的瞬間尘奏,已是汗流浹背。 一陣腳步聲響...
推薦閱讀更多精彩內(nèi)容
- 排序的基本概念 在計算機程序開發(fā)過程中赋铝,經(jīng)常需要一組數(shù)據(jù)元素(或記錄)按某個關鍵字進行排序插勤,排序完成的序列可用于快...
- 概述 排序有內(nèi)部排序和外部排序,內(nèi)部排序是數(shù)據(jù)記錄在內(nèi)存中進行排序革骨,而外部排序是因排序的數(shù)據(jù)很大农尖,一次不能容納全部...
- 概述:排序有內(nèi)部排序和外部排序,內(nèi)部排序是數(shù)據(jù)記錄在內(nèi)存中進行排序良哲,而外部排序是因排序的數(shù)據(jù)很大卤橄,一次不能容納全部...