當前位置:首頁 » 操作系統 » 穩定的排序演算法有哪些

穩定的排序演算法有哪些

發布時間: 2023-03-17 00:28:35

❶ 常見穩定排序和不穩定排序區別

穩定排序包括插入排序、冒泡排序、歸並排序、基數排序

穩定性分析

插入排序:在一個有序的序列中插入一個數,使插入後的序列保持有序。因為插入的過程中都是從後向前進行查找,遇到小於等於(或大於等於)的數停止尋找,進行插入操作。不改變排序前後相等數值的相對順序,故使穩定的排序演算法

冒泡排序:冒泡故名思義,數值小的向上飄,數值大的向下沉,向上飄的數遇到的小於等於當前數的值停止,向下沉的數遇到大於等於當前數的數停止,類似於對於向上飄的數有個排序之前在其前面數值相等限制了其向上飄的腳步,原先在俺之下,排序後也在俺之下,向下沉也是同理。故也是穩定的排序演算法。

歸並排序:將一段序列分為若干個小序列進行排序,排序後的小序列進行合並得到最後的排序結果。主要運用了分治的思想。分成的前後若干個小序列在最後進行合並時本身就包含了前後位置信息,在合並時不改變相同值在排序前後的相對順序,故歸並排序也是穩定排序。

基數排序:按從低到高的相應位的值進行排序,也是穩定排序演算法。

非穩定排序演算法包括改寬:選擇排序、快速排序、希爾排序、堆排序

對於這種非穩定排序,我習慣是記住一個例子就好

選擇排序:

[1,2,4,2,5,3 ] 

主要思想是分別找出當前遍歷元素中的最小值與相應位置的數進行交換,第一遍尋找元素的從第一個元素起的最小值(或最大值)和第一個滲殲握元素進行交換,第二趟尋找從第二個元素起最小的(或最大的)元素與第二個元素進行交換,以此類推。

[3,3',2]    排序後  [2,3',3]

快速排序叢慶

[5,3,3,4,3',8,7]  排序後[3',3,3,4,5,8,7]

希爾排序

一次插入排序是穩定的,多次插入排序不是穩定的。

堆排序

不是穩定排序演算法,下次補充。

❷ 排序演算法穩定性的常見排序演算法的穩定性


堆排序、快速排序、希爾排序、直接選擇排序不是穩定的排序演算法,而基數排序、冒泡排序、直接插入排序、折半插入排序、歸並排序是穩定的排序演算法。
首先,排序演算法的穩定性大家應該都知道,通俗地講就是能保證排序前2個相等的數其在序列的前後位置順序和排序後它們兩個的前後位置順序相同。在簡單形式化一下,如果Ai = Aj, Ai原來在位置前,排序後Ai還是要在Aj位置前。
其次,說一下穩定性的好處。排序演算法如果是穩定的,那麼從一個鍵上排序,然後再從另一個鍵上排序,第一個鍵排序的結果可以為第二個鍵排序所用。基數排序就 是這樣,先按低位排序,逐次按高位排序,低位相同的元素其順序再高位也相同時是不會改變的。
回到主題,現在分析一下常見的排序演算法的穩定性,每個都給出簡單的理由。
(1)冒泡排序
冒泡排序就是把小的元素往前調或者把大的元素往後調。比較是相鄰的兩個元素比較,交換也發生在這兩個元素之間。所以,如果兩個元素相等,我想你是不會再無 聊地把他們倆交換一下的;如果兩個相等的元素沒有相鄰,那麼即使通過前面的兩兩交換把兩個相鄰起來,這時候也不會交換,所以相同元素的前後順序並沒有改 變,所以冒泡排序是一種穩定排序演算法。
(2)選擇排序
選擇排序是給每個位置選擇當前元素最小的,比如給第一個位置選擇最小的,在剩餘元素裡面給第二個元素選擇第二小的,依次類推,直到第n-1個元素,第n個 元素不用選擇了,因為只剩下它一個最大的元素了。那麼,在一趟選擇,如果當前元素比一個元素小,而該小的元素又出現在一個和當前元素相等的元素後面,那麼 交換後穩定性就被破壞了。比較拗口,舉個例子,序列5 8 5 2 9, 我們知道第一遍選擇第1個元素5會和2交換,那麼原序列中2個5的相對前後順序就被破壞了,所以選擇排序不是一個穩定的排序演算法。
(3)插入排序
插入排序是在一個已經有序的小序列的基礎上,一次插入一個元素。當然,剛開始這個有序的小序列只有1個元素,就是第一個元素。比較是從有序序列的末尾開 始,也就是想要插入的元素和已經有序的最大者開始比起,如果比它大則直接插入在其後面,否則一直往前找直到找到它該插入的位置。如果碰見一個和插入元素相 等的,那麼插入元素把想插入的元素放在相等元素的後面。所以,相等元素的前後順序沒有改變,從原無序序列出去的順序就是排好序後的順序,所以插入排序是穩 定的。
(4)快速排序
快速排序有兩個方向,左邊的i下標一直往右走,當a[i] <= a[center_index],其中center_index是中樞元素的數組下標,一般取為數組第0個元素。而右邊的j下標一直往左走,當a[j] > a[center_index]。如果i和j都走不動了,i <= j, 交換a[i]和a[j],重復上面的過程,直到i>j。 交換a[j]和a[center_index],完成一趟快速排序。在中樞元素和a[j]交換的時候,很有可能把前面的元素的穩定性打亂,比如序列為 5 3 3 4 3 8 9 10 11, 現在中樞元素5和3(第5個元素,下標從1開始計)交換就會把元素3的穩定性打亂,所以快速排序是一個不穩定的排序演算法,不穩定發生在中樞元素和a[j] 交換的時刻。
(5)歸並排序
歸並排序是把序列遞歸地分成短序列,遞歸出口是短序列只有1個元素(認為直接有序)或者2個序列(1次比較和交換),然後把各個有序的段序列合並成一個有 序的長序列,不斷合並直到原序列全部排好序。可以發現,在1個或2個元素時,1個元素不會交換,2個元素如果大小相等也沒有人故意交換,這不會破壞穩定 性。那麼,在短的有序序列合並的過程中,穩定是是否受到破壞?沒有,合並過程中我們可以保證如果兩個當前元素相等時,我們把處在前面的序列的元素保存在結 果序列的前面,這樣就保證了穩定性。所以,歸並排序也是穩定的排序演算法。
(6)基數排序
基數排序是按照低位先排序,然後收集;再按照高位排序,然後再收集;依次類推,直到最高位。有時候有些屬性是有優先順序順序的,先按低優先順序排序,再按高優 先級排序,最後的次序就是高優先順序高的在前,高優先順序相同的低優先順序高的在前。基數排序基於分別排序,分別收集,所以其是穩定的排序演算法。
(7)希爾排序(shell)
希爾排序是按照不同步長對元素進行插入排序,當剛開始元素很無序的時候,步長最大,所以插入排序的元素個數很少,速度很快;當元素基本有序了,步長很小, 插入排序對於有序的序列效率很高。所以,希爾排序的時間復雜度會比o(n^2)好一些。由於多次插入排序,我們知道一次插入排序是穩定的,不會改變相同元 素的相對順序,但在不同的插入排序過程中,相同的元素可能在各自的插入排序中移動,最後其穩定性就會被打亂,所以shell排序是不穩定的。
(8)堆排序
我們知道堆的結構是節點i的孩子為2*i和2*i+1節點,大頂堆要求父節點大於等於其2個子節點,小頂堆要求父節點小於等於其2個子節點。在一個長為n 的序列,堆排序的過程是從第n/2開始和其子節點共3個值選擇最大(大頂堆)或者最小(小頂堆),這3個元素之間的選擇當然不會破壞穩定性。但當為n /2-1, n/2-2, ...1這些個父節點選擇元素時,就會破壞穩定性。有可能第n/2個父節點交換把後面一個元素交換過去了,而第n/2-1個父節點把後面一個相同的元素沒 有交換,那麼這2個相同的元素之間的穩定性就被破壞了。所以,堆排序不是穩定的排序演算法。
綜上,得出結論: 選擇排序、快速排序、希爾排序、堆排序不是穩定的排序演算法,而冒泡排序、插入排序、歸並排序和基數排序是穩定的排序演算法。

❸ 各種排序演算法的總結和比較

排序演算法是《數據結構與演算法》中最基本的演算法之一。

排序演算法可以分為內部排序和外部排序,內部排序是數據記錄在內存中進行排序,而外部排序是因排序的數據很大,一次不能容納全部的排序記錄,在排序過程中需要訪問外存。常見的內部排序演算法有:插入排序、希爾排序、選擇排序、冒泡排序、歸並排序、快速排序、堆排序、基數排序等。用一張圖概括:

點擊以下圖片查看大圖:

關於時間復雜度

平方階 (O(n2)) 排序 各類簡單排序:直接插入、直接選擇和冒泡排序。

線性對數階 (O(nlog2n)) 排序 快速排序、堆排序和歸並排序;

O(n1+§)) 排序,§ 是介於 0 和 1 之間的常數。 希爾排序

線性階 (O(n)) 排序 基數排序,此外還有桶、箱排序。

關於穩定性

穩定的排序演算法:冒泡排序、插入排序、歸並排序和基數排序。

不是穩定的排序演算法:選擇排序、快速排序、希爾排序、堆排序。

名詞解釋:

n:數據規模 k:"桶"的個數 In-place:佔用常數內存,不佔用額外內存 Out-place:佔用額外內存 穩定性:排序後 2 個相等鍵值的順序和排序之前它們的順序相同

包含以下內容:

1、冒泡排序 2、選擇排序 3、插入排序數搭 4、希爾排序 5、歸並排序 6、快速排序 7、堆排序 8、計數排序 9、桶排序 10、基數排序

排序演算法包含的相關內容具體如下:

冒泡排序演算法

冒泡排序(Bubble Sort)也是一種簡單直觀的排序演算法。它重復地走訪過要排序的數列,一次比較兩個元素,如果他們的順序錯誤就把他們交換過來。走訪數列的工作是重復地進行直到沒有再需要交換,也就是說該薯畝拿數列已經排序完成。這個演算法的名字由來是因為越小的元素會經由交換慢慢"浮"到數列的頂端。

選擇排序演算法

選擇排序是一種簡單直觀的排序演算法,耐差無論什麼數據進去都是 O(n?) 的時間復雜度。所以用到它的時候,數據規模越小越好。唯一的好處可能就是不佔用額外的內存空間。

插入排序演算法

插入排序的代碼實現雖然沒有冒泡排序和選擇排序那麼簡單粗暴,但它的原理應該是最容易理解的了,因為只要打過撲克牌的人都應該能夠秒懂。插入排序是一種最簡單直觀的排序演算法,它的工作原理是通過構建有序序列,對於未排序數據,在已排序序列中從後向前掃描,找到相應位置並插入。

希爾排序演算法

希爾排序,也稱遞減增量排序演算法,是插入排序的一種更高效的改進版本。但希爾排序是非穩定排序演算法。

歸並排序演算法

歸並排序(Merge sort)是建立在歸並操作上的一種有效的排序演算法。該演算法是採用分治法(Divide and Conquer)的一個非常典型的應用。

快速排序演算法

快速排序是由東尼·霍爾所發展的一種排序演算法。在平均狀況下,排序 n 個項目要 Ο(nlogn) 次比較。在最壞狀況下則需要 Ο(n2) 次比較,但這種狀況並不常見。事實上,快速排序通常明顯比其他 Ο(nlogn) 演算法更快,因為它的內部循環(inner loop)可以在大部分的架構上很有效率地被實現出來。

堆排序演算法

堆排序(Heapsort)是指利用堆這種數據結構所設計的一種排序演算法。堆積是一個近似完全二叉樹的結構,並同時滿足堆積的性質:即子結點的鍵值或索引總是小於(或者大於)它的父節點。堆排序可以說是一種利用堆的概念來排序的選擇排序。

計數排序演算法

計數排序的核心在於將輸入的數據值轉化為鍵存儲在額外開辟的數組空間中。作為一種線性時間復雜度的排序,計數排序要求輸入的數據必須是有確定范圍的整數。

桶排序演算法

桶排序是計數排序的升級版。它利用了函數的映射關系,高效與否的關鍵就在於這個映射函數的確定。

基數排序演算法

基數排序是一種非比較型整數排序演算法,其原理是將整數按位數切割成不同的數字,然後按每個位數分別比較。由於整數也可以表達字元串(比如名字或日期)和特定格式的浮點數,所以基數排序也不是只能使用於整數。

❹ 哪些排序演算法是穩定的

冒泡排序、插入排序、歸並排序和基數排序是穩定的排序演算法。選擇排序、快速排序、希爾排序、堆排序不是穩定的排序演算法。基數排序是按照低位先排序,然後收集;再按照高位排序,然後再收集;依次類推,直到最高位。有時候有些屬性是有優先順序順序的,先按低優先順序排序,再按高優先順序排序,最後的次序就是高優先順序高的在前,高優先順序相同的低優先順序高的在前。基數排序基於分別排序,分別收集,所以其是穩定的排序演算法。
更多關於哪些排序演算法是穩定的,進入:https://www.abcgonglue.com/ask/5191a91616094550.html?zd查看更多內容

❺ 數據結構的排序演算法中,哪些排序是穩定的,哪些排序是不穩定的

一、穩定排序演算法

1、冒泡排序

2、雞尾酒排序

3、插入排序

4、桶排序

5、計數排序

6、合並排序

7、基數排序

8、二叉排序樹排序

二、不穩定排序演算法

1、選擇排序

2、希爾排序

3、組合排序

4、堆排序

5、平滑排序

6、快速排序

排序(Sorting) 是計算機程序設計中的一種重要操作,它的功能是將一個數據元素(或記錄)的任意序列,重新排列成一個關鍵字有序的序列。

一個排序演算法是穩定的,就是當有兩個相等記錄的關鍵字R和S,且在原本的列表中R出現在S之前,在排序過的列表中R也將會是在S之前。

不穩定排序演算法可能會在相等的鍵值中改變紀錄的相對次序,但是穩定排序演算法從來不會如此。不穩定排序演算法可以被特別地實現為穩定。

做這件事情的一個方式是人工擴充鍵值的比較,如此在其他方面相同鍵值的兩個對象間之比較,就會被決定使用在原先數據次序中的條目,當作一個同分決賽。然而,要記住這種次序通常牽涉到額外的空間負擔。

(5)穩定的排序演算法有哪些擴展閱讀:

排序演算法的分類:

1、通過時間復雜度分類

計算的復雜度(最差、平均、和最好性能),依據列表(list)的大小(n)。

一般而言,好的性能是 O(nlogn),且壞的性能是 O(n^2)。對於一個排序理想的性能是 O(n)。

而僅使用一個抽象關鍵比較運算的排序演算法總平均上總是至少需要 O(nlogn)。

2、通過空間復雜度分類

存儲器使用量(空間復雜度)(以及其他電腦資源的使用)

3、通過穩定性分類

穩定的排序演算法會依照相等的關鍵(換言之就是值)維持紀錄的相對次序。

❻ 數據結構的排序演算法中,哪些排序是穩定的,哪些排序是不穩定的

快速排序、希爾排序、堆排序、直接選擇排序不是穩定的排序演算法。

基數排序、冒泡排序、直接插入排序、折半插入排序、歸並排序是穩定的排序演算法。

❼ 在快速排序、堆排序、歸並排序中,什麼排序是穩定的

歸並排序是穩定的排序演算法。

歸並排序的穩定性分析:

歸並排序是把序列遞歸地分成短序列,遞歸出口是短序列只有1個元素或者2個序列,然後把各個有序的段序列合並成一個有序的長序列,不斷合並直到原序列全部排好序。

可以發現,在1個或2個元素時,1個元素不會交換,2個元素如果大小相等,沒有外部干擾,將不會破壞穩定性。

那麼,在短的有序序列合並的過程中,穩定性是沒有受到破壞的,合並過程中如果兩個當前元素相等時,把處在前面的序列的元素保存在結果序列的前面,這樣就保證了穩定性。所以,歸並排序也是穩定的排序演算法。

(7)穩定的排序演算法有哪些擴展閱讀:

演算法穩定性的判斷方法:

在常見的排序演算法中,堆排序、快速排序、希爾排序、直接選擇排序是不穩定的排序演算法,而基數排序、冒泡排序、直接插入排序、折半插入排序、歸並排序是穩定的排序演算法。

對於不穩定的排序演算法,只要舉出一個實例,即可說明它的不穩定性;而對於穩定的排序演算法,必須對演算法進行分析從而得到穩定的特性。

需要注意的是,排序演算法是否為穩定的是由具體演算法決定的,不穩定的演算法在某種條件下可以變為穩定的演算法,而穩定的演算法在某種條件下也可以變為不穩定的演算法。

比如,快速排序原本是不穩定的排序方法,但若待排序記錄中只有一組具有相同關鍵碼的記錄,而選擇的軸值恰好是這組相同關鍵碼中的一個,此時的快速排序就是穩定的。

參考資料來源:網路-排序演算法穩定性

❽ 穩定的排序演算法有哪些

1.穩定的排序
冒泡排序(bubble sort) — O(n2)
雞尾酒排序 (Cocktail sort, 雙向的冒泡排序) — O(n2)
插入排序 (insertion sort)— O(n2)
桶排序 (bucket sort)— O(n); 需要 O(k) 額外 記憶體
計數排序 (counting sort) — O(n+k); 需要 O(n+k) 額外 記憶體
歸並排序 (merge sort)— O(n log n); 需要 O(n) 額外記憶體
原地歸並排序 — O(n2)
二叉樹排序 (Binary tree sort) — O(n log n); 需要 O(n) 額外記憶體
鴿巢排序 (Pigeonhole sort) — O(n+k); 需要 O(k) 額外記憶體
基數排序 (radix sort)— O(n·k); 需要 O(n) 額外記憶體
Gnome sort — O(n2)
Library sort — O(n log n) with high probability, 需要 (1+ε)n 額外記憶體
2.不穩定的排序
選擇排序 (selection sort)— O(n2)
希爾排序 (shell sort)— O(n log n) 如果使用最佳的現在版本
Comb sort — O(n log n)
堆排序 (heapsort)— O(n log n)
Smoothsort — O(n log n)
快速排序 (quicksort)— O(n log n) 期望時間, O(n2) 最壞情況; 對於大的、亂數串列一般相信是最快的已知排序
Introsort — O(n log n)
Patience sorting — O(n log n + k) 最外情況時間, 需要 額外的 O(n + k) 空間, 也需要找到最長的遞增子序列(longest increasing subsequence)

❾ 排序演算法的穩定性

常用的幾種排序演算法中,穩定的排序有,冒泡排序,插入排序,歸並排序,不穩定的排序有選擇排序希爾排序,快速排序,堆排序,二叉排序樹排序,等等。

❿ 演算法-排序-穩定與不穩定排序

參考: https://www.jianshu.com/p/7c03e5eb143c

穩定排序有:插入排序、冒泡排序、歸並排序、基數排序

不穩定排序有:選擇排序、快速排序、希爾排序、堆排序

插入排序

冒泡排序

歸並排序

基數排序

非穩定排序演算法包括:選擇排序、快速排序、希爾排序高漏、堆排序滾友*

選擇排序:

例子如下:[4,4',2] 排序後 [2,4',4]

快速排序

這里可以使用例子進行記憶:以5作為基準,從最右元素找到小於5的元素3`

然後將5和3`進行互換, 就會發現3·在前面的情況,即出現了不穩定的情況。

[5,3,3,4,3',8,7] 排序後[3',3,3,4,5,8,7]

希爾排序

一次插入排序是穩定的,多次插入排序不是穩定的。大念槐

[3,3`,2,4]

最終的結果為:

[2,3`,3,4]

其中3和3`的順序發生變化。

堆排序

熱點內容
安卓java編程 發布:2025-08-25 05:39:07 瀏覽:927
實用演算法試題 發布:2025-08-25 05:37:50 瀏覽:786
網路用語腳本 發布:2025-08-25 05:23:45 瀏覽:193
畢業mv腳本 發布:2025-08-25 05:22:56 瀏覽:812
對象存儲使用場景 發布:2025-08-25 04:55:09 瀏覽:490
裝wf鎖了一般原始密碼是多少 發布:2025-08-25 04:40:14 瀏覽:357
sql轉mysql 發布:2025-08-25 04:40:12 瀏覽:882
交互性編程 發布:2025-08-25 04:33:01 瀏覽:961
編譯器一般多少行代碼 發布:2025-08-25 04:32:28 瀏覽:769
asp班級源碼 發布:2025-08-25 04:28:06 瀏覽:504