導航:首頁 > 源碼編譯 > 快排堆排演算法

快排堆排演算法

發布時間:2022-10-21 12:36:19

① 對同一個基本有序的待排序列分別進行堆排序、快速排序和冒泡排序,最省時間的演算法是什麼

對同一個基本有序的待排序列分別進行堆排序、快速排序和冒泡排序,最省時間的演算法是冒泡排序。

冒泡排序的最好比較次數為n次,最差比較次數為n^2次,最差比較次數為0次,最差比較次數為n^2次,最差比較次數為1次,最差比較次數為1次。

快速排序的最好比較次數為nlogn次,最差比較次數為n^2次,最差比較次數為logn次,最差比較次數為n次,最差比較次數為logn次,最差比較次數為n次。

堆排序的最好比較次數為nlogn次,最差比較次數為nlogn次,最差比較次數為nlogn次,最差比較次數為nlogn次,最差比較次數為1次,最差比較次數為1次。

(1)快排堆排演算法擴展閱讀:

冒泡排序(BubbleSort)重復地走訪過要排序的元素列,依次比較兩個相鄰的元素,如果順序(如從大到小、首字母從Z到A)錯誤就把他們交換過來。走訪元素的工作是重復地進行直到沒有相鄰元素需要交換,也就是說該元素列已經排序完成。

由於冒泡排序比較是相鄰的兩個元素,交換也發生在這兩個元素之間。所以,如果兩個元素相等,是不會再交換的;如果兩個相等的元素沒有相鄰,那麼即使通過前面的兩兩交換把兩個相鄰起來,這時候也不會交換,所以相同元素的前後順序並沒有改變,所以冒泡排序是一種穩定排序演算法。

② 常用的排序演算法都有哪些

排序演算法 所謂排序,就是使一串記錄,按照其中的某個或某些關鍵字的大小,遞增或遞減的排列起來的操作。
分類
在計算機科學所使用的排序演算法通常被分類為:
計算的復雜度(最差、平均、和最好表現),依據串列(list)的大小(n)。一般而言,好的表現是O。(n log n),且壞的行為是Ω(n2)。對於一個排序理想的表現是O(n)。僅使用一個抽象關鍵比較運算的排序演算法總平均上總是至少需要Ω(n log n)。
記憶體使用量(以及其他電腦資源的使用)
穩定度:穩定排序演算法會依照相等的關鍵(換言之就是值)維持紀錄的相對次序。也就是一個排序演算法是穩定的,就是當有兩個有相等關鍵的紀錄R和S,且在原本的串列中R出現在S之前,在排序過的串列中R也將會是在S之前。
一般的方法:插入、交換、選擇、合並等等。交換排序包含冒泡排序(bubble sort)和快速排序(quicksort)。選擇排序包含shaker排序和堆排序(heapsort)。
當相等的元素是無法分辨的,比如像是整數,穩定度並不是一個問題。然而,假設以下的數對將要以他們的第一個數字來排序。
(4, 1) (3, 1) (3, 7) (5, 6)
在這個狀況下,有可能產生兩種不同的結果,一個是依照相等的鍵值維持相對的次序,而另外一個則沒有:
(3, 1) (3, 7) (4, 1) (5, 6) (維持次序)
(3, 7) (3, 1) (4, 1) (5, 6) (次序被改變)
不穩定排序演算法可能會在相等的鍵值中改變紀錄的相對次序,但是穩定排序演算法從來不會如此。不穩定排序演算法可以被特別地時作為穩定。作這件事情的一個方式是人工擴充鍵值的比較,如此在其他方面相同鍵值的兩個物件間之比較,就會被決定使用在原先資料次序中的條目,當作一個同分決賽。然而,要記住這種次序通常牽涉到額外的空間負擔。
排列演算法列表
在這個表格中,n是要被排序的紀錄數量以及k是不同鍵值的數量。
穩定的
冒泡排序(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 額外記憶體
不穩定
選擇排序 (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)
不實用的排序演算法
Bogo排序 — O(n × n!) 期望時間, 無窮的最壞情況。
Stupid sort — O(n3); 遞回版本需要 O(n2) 額外記憶體
Bead sort — O(n) or O(√n), 但需要特別的硬體
Pancake sorting — O(n), 但需要特別的硬體
排序的演算法
排序的演算法有很多,對空間的要求及其時間效率也不盡相同。下面列出了一些常見的排序演算法。這裡面插入排序和冒泡排序又被稱作簡單排序,他們對空間的要求不高,但是時間效率卻不穩定;而後面三種排序相對於簡單排序對空間的要求稍高一點,但時間效率卻能穩定在很高的水平。基數排序是針對關鍵字在一個較小范圍內的排序演算法。
插入排序
冒泡排序
選擇排序
快速排序
堆排序
歸並排序
基數排序
希爾排序
插入排序
插入排序是這樣實現的:
首先新建一個空列表,用於保存已排序的有序數列(我們稱之為"有序列表")。
從原數列中取出一個數,將其插入"有序列表"中,使其仍舊保持有序狀態。
重復2號步驟,直至原數列為空。
插入排序的平均時間復雜度為平方級的,效率不高,但是容易實現。它藉助了"逐步擴大成果"的思想,使有序列表的長度逐漸增加,直至其長度等於原列表的長度。
冒泡排序
冒泡排序是這樣實現的:
首先將所有待排序的數字放入工作列表中。
從列表的第一個數字到倒數第二個數字,逐個檢查:若某一位上的數字大於他的下一位,則將它與它的下一位交換。
重復2號步驟,直至再也不能交換。
冒泡排序的平均時間復雜度與插入排序相同,也是平方級的,但也是非常容易實現的演算法。
選擇排序
選擇排序是這樣實現的:
設數組內存放了n個待排數字,數組下標從1開始,到n結束。
i=1
從數組的第i個元素開始到第n個元素,尋找最小的元素。
將上一步找到的最小元素和第i位元素交換。
如果i=n-1演算法結束,否則回到第3步
選擇排序的平均時間復雜度也是O(n²)的。
快速排序
現在開始,我們要接觸高效排序演算法了。實踐證明,快速排序是所有排序演算法中最高效的一種。它採用了分治的思想:先保證列表的前半部分都小於後半部分,然後分別對前半部分和後半部分排序,這樣整個列表就有序了。這是一種先進的思想,也是它高效的原因。因為在排序演算法中,演算法的高效與否與列表中數字間的比較次數有直接的關系,而"保證列表的前半部分都小於後半部分"就使得前半部分的任何一個數從此以後都不再跟後半部分的數進行比較了,大大減少了數字間不必要的比較。但查找數據得另當別論了。
堆排序
堆排序與前面的演算法都不同,它是這樣的:
首先新建一個空列表,作用與插入排序中的"有序列表"相同。
找到數列中最大的數字,將其加在"有序列表"的末尾,並將其從原數列中刪除。
重復2號步驟,直至原數列為空。
堆排序的平均時間復雜度為nlogn,效率高(因為有堆這種數據結構以及它奇妙的特徵,使得"找到數列中最大的數字"這樣的操作只需要O(1)的時間復雜度,維護需要logn的時間復雜度),但是實現相對復雜(可以說是這里7種演算法中比較難實現的)。
看起來似乎堆排序與插入排序有些相像,但他們其實是本質不同的演算法。至少,他們的時間復雜度差了一個數量級,一個是平方級的,一個是對數級的。
平均時間復雜度
插入排序 O(n2)
冒泡排序 O(n2)
選擇排序 O(n2)
快速排序 O(n log n)
堆排序 O(n log n)
歸並排序 O(n log n)
基數排序 O(n)
希爾排序 O(n1.25)
冒泡排序
654
比如說這個,我想讓它從小到大排序,怎麼做呢?
第一步:6跟5比,發現比它大,則交換。564
第二步:5跟4比,發現比它大,則交換。465
第三步:6跟5比,發現比它大,則交換。456

③ 數據結構中堆排序,快速排序,歸並排序排序的時間復雜度順序快慢依次是什麼

堆排序 平均時間:O(n*logn) 最壞:O(n*logn)
快速排序 平均時間:O(n*logn) 最壞:O(n的平方)
歸並排序 平均時間:O(n*logn) 最壞:O(n的平方)
排序演算法沒有最快情況的說法。

從平均性能來說,快速排序最佳,因為所需時間最短,但快速排序在最壞情況下的時間性能不如堆排序和歸並排序。n較大時,歸並排序所需時間較堆排序省,但歸並排序需要的輔助存儲量更大。

④ 快速排序是最好的排序演算法嗎

我們通常所說的排序演算法往往指的是內部排序演算法,即數據記錄在內存中進行排序。
排序演算法大體可分為兩種:
一種是比較排序,時間復雜度O(nlogn)
~
O(n^2),主要有:冒泡排序,選擇排序,插入排序,歸並排序,堆排序,快速排序等。
另一種是非比較排序,時間復雜度可以達到O(n),主要有:計數排序,基數排序,桶排序等。
我不知道你說的好是什麼標准,從時間上看,快速排序在比較排序中是最快的,但是快不過非比較排序。當然,在內存耗費上看,快速排序也不是耗費最小的。

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

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

歸並排序的穩定性分析:

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

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

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

(5)快排堆排演算法擴展閱讀:

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

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

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

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

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

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

⑥ 排序演算法概述

十大排序演算法:冒泡排序,選擇排序,插入排序,歸並排序,堆排序,快速排序、希爾排序、計數排序,基數排序,桶排序

穩定 :如果a原本在b前面,而a=b,排序之後a仍然在b的前面;
不穩定 :如果a原本在b的前面,而a=b,排序之後a可能會出現在b的後面;
排序演算法如果是穩定的,那麼從一個鍵上排序,然後再從另一個鍵上排序,前一個鍵排序的結果可以為後一個鍵排序所用。

演算法的復雜度往往取決於數據的規模大小和數據本身分布性質。
時間復雜度 : 一個演算法執行所耗費的時間。
空間復雜度 :對一個演算法在運行過程中臨時佔用存儲空間大小的量度。
常見復雜度由小到大 :O(1) < O(logn) < O(n) < O(nlogn) < O(n^2) < O(n^3) < O(2^n)

在各種不同演算法中,若演算法中語句執行次數(佔用空間)為一個常數,則復雜度為O(1);
當一個演算法的復雜度與以2為底的n的對數成正比時,可表示為O(log n);
當一個演算法的復雜度與n成線性比例關系時,可表示為O (n),依次類推。

冒泡、選擇、插入排序需要兩個for循環,每次只關注一個元素,平均時間復雜度為
(一遍找元素O(n),一遍找位置O(n))
快速、歸並、堆基於分治思想,log以2為底,平均時間復雜度往往和O(nlogn)(一遍找元素O(n),一遍找位置O(logn))相關
而希爾排序依賴於所取增量序列的性質,但是到目前為止還沒有一個最好的增量序列 。例如希爾增量序列時間復雜度為O(n²),而Hibbard增量序列的希爾排序的時間復雜度為 , 有人在大量的實驗後得出結論;當n在某個特定的范圍後希爾排序的最小時間復雜度大約為n^1.3。

從平均時間來看,快速排序是效率最高的:
快速排序中平均時間復雜度O(nlog n),這個公式中隱含的常數因子很小,比歸並排序的O(nlog n)中的要小很多,所以大多數情況下,快速排序總是優於合並排序的。

而堆排序的平均時間復雜度也是O(nlog n),但是堆排序存在著重建堆的過程,它把根節點移除後,把最後的葉子結點拿上來後需要重建堆,但是,拿上的值是要比它的兩個葉子結點要差很多的,一般要比較很多次,才能回到合適的位置。堆排序就會有很多的時間耗在堆調整上。

雖然快速排序的最壞情況為排序規模(n)的平方關系,但是這種最壞情況取決於每次選擇的基準, 對於這種情況,已經提出了很多優化的方法,比如三取樣劃分和Dual-Pivot快排。
同時,當排序規模較小時,劃分的平衡性容易被打破,而且頻繁的方法調用超過了O(nlog n)為
省出的時間,所以一般排序規模較小時,會改用插入排序或者其他排序演算法。

一種簡單的排序演算法。它反復地走訪過要排序的數列,一次比較兩個元素,如果它們的順序錯誤就把它們交換過來。這個工作重復地進行直到沒有元素再需要交換,也就是說該數列已經排序完成。這個演算法的名字由來是因為元素會經由交換慢慢「浮」到數列的頂端。
1.從數組頭開始,比較相鄰的元素。如果第一個比第二個大(小),就交換它們兩個;
2.對每一對相鄰元素作同樣的工作,從開始第一對到尾部的最後一對,這樣在最後的元素應該會是最大(小)的數;
3.重復步驟1~2,重復次數等於數組的長度,直到排序完成。

首先,找到數組中最大(小)的那個元素;
其次,將它和數組的第一個元素交換位置(如果第一個元素就是最大(小)元素那麼它就和自己交換);
再次,在剩下的元素中找到最大(小)的元素,將它與數組的第二個元素交換位置。如此往復,直到將整個數組排序。
這種方法叫做選擇排序,因為它在不斷地選擇剩餘元素之中的最大(小)者。

對於未排序數據,在已排序序列中從後向前掃描,找到相應位置並插入。
為了給要插入的元素騰出空間,我們需要將插入位置之後的已排序元素在都向後移動一位。
插入排序所需的時間取決於輸入中元素的初始順序。例如,對一個很大且其中的元素已經有序(或接近有序)的數組進行排序將會比對隨機順序的數組或是逆序數組進行排序要快得多。
總的來說,插入排序對於部分有序的數組十分高效,也很適合小規模數組。

一種基於插入排序的快速的排序演算法。簡單插入排序對於大規模亂序數組很慢,因為元素只能一點一點地從數組的一端移動到另一端。例如,如果主鍵最小的元素正好在數組的盡頭,要將它挪到正確的位置就需要N-1 次移動。
希爾排序為了加快速度簡單地改進了插入排序,也稱為縮小增量排序,同時該演算法是突破O(n^2)的第一批演算法之一。
希爾排序是把待排序數組按一定數量的分組,對每組使用直接插入排序演算法排序;然後縮小數量繼續分組排序,隨著數量逐漸減少,每組包含的元素越來越多,當數量減至 1 時,整個數組恰被分成一組,排序便完成了。這個不斷縮小的數量,就構成了一個增量序列。

在先前較大的增量下每個子序列的規模都不大,用直接插入排序效率都較高,盡管在隨後的增量遞減分組中子序列越來越大,由於整個序列的有序性也越來越明顯,則排序效率依然較高。
從理論上說,只要一個數組是遞減的,並且最後一個值是1,都可以作為增量序列使用。有沒有一個步長序列,使得排序過程中所需的比較和移動次數相對較少,並且無論待排序列記錄數有多少,演算法的時間復雜度都能漸近最佳呢?但是目前從數學上來說,無法證明某個序列是「最好的」。
常用的增量序列
希爾增量序列 :{N/2, (N / 2)/2, ..., 1},其中N為原始數組的長度,這是最常用的序列,但卻不是最好的
Hibbard序列:{2^k-1, ..., 3,1}
Sedgewick序列:{... , 109 , 41 , 19 , 5,1} 表達式為

歸並排序是建立在歸並操作上的一種有效的排序演算法。該演算法是採用分治法的一個非常典型的應用。
對於給定的一組數據,利用遞歸與分治技術將數據序列劃分成為越來越小的半子表,在對半子表排序後,再用遞歸方法將排好序的半子表合並成為越來越大的有序序列。
為了提升性能,有時我們在半子表的個數小於某個數(比如15)的情況下,對半子表的排序採用其他排序演算法,比如插入排序。
若將兩個有序表合並成一個有序表,稱為2-路歸並,與之對應的還有多路歸並。

快速排序(Quicksort)是對冒泡排序的一種改進,也是採用分治法的一個典型的應用。
首先任意選取一個數據(比如數組的第一個數)作為關鍵數據,我們稱為基準數(Pivot),然後將所有比它小的數都放到它前面,所有比它大的數都放到它後面,這個過程稱為一趟快速排序,也稱為分區(partition)操作。
通過一趟快速排序將要排序的數據分割成獨立的兩部分,其中一部分的所有數據都比另外一部分的所有數據都要小,然後再按此方法對這兩部分數據分別進行快速排序,整個排序過程可以遞歸進行,以此達到整個數組變成有序序列。
為了提升性能,有時我們在分割後獨立的兩部分的個數小於某個數(比如15)的情況下,會採用其他排序演算法,比如插入排序。

基準的選取:最優的情況是基準值剛好取在無序區數值的中位數,這樣能夠最大效率地讓兩邊排序,同時最大地減少遞歸劃分的次數,但是一般很難做到最優。基準的選取一般有三種方式,選取數組的第一個元素,選取數組的最後一個元素,以及選取第一個、最後一個以及中間的元素的中位數(如4 5 6 7, 第一個4, 最後一個7, 中間的為5, 這三個數的中位數為5, 所以選擇5作為基準)。
Dual-Pivot快排:雙基準快速排序演算法,其實就是用兩個基準數, 把整個數組分成三份來進行快速排序,在這種新的演算法下面,比經典快排從實驗來看節省了10%的時間。

許多應用程序都需要處理有序的元素,但不一定要求他們全部有序,或者不一定要一次就將他們排序,很多時候,我們每次只需要操作數據中的最大元素(最小元素),那麼有一種基於二叉堆的數據結構可以提供支持。
所謂二叉堆,是一個完全二叉樹的結構,同時滿足堆的性質:即子結點的鍵值或索引總是小於(或者大於)它的父節點。在一個二叉堆中,根節點總是最大(或者最小)節點。
堆排序演算法就是抓住了這一特點,每次都取堆頂的元素,然後將剩餘的元素重新調整為最大(最小)堆,依次類推,最終得到排序的序列。

推論1:對於位置為K的結點 左子結點=2 k+1 右子結點=2 (k+1)
驗證:C:2 2 2+1=5 2 (2+1)=6
推論2:最後一個非葉節點的位置為 (N/2)-1,N為數組長度。
驗證:數組長度為6,(6/2)-1=2

計數排序對一定范圍內的整數排序時候的速度非常快,一般快於其他排序演算法。但計數排序局限性比較大,只限於對整數進行排序,而且待排序元素值分布較連續、跨度小的情況。
計數排序是一個排序時不比較元素大小的排序演算法。
如果一個數組里所有元素都是整數,而且都在0-K以內。對於數組里每個元素來說,如果能知道數組里有多少項小於或等於該元素,就能准確地給出該元素在排序後的數組的位置。

桶排序 (Bucket sort)的工作的原理:假設輸入數據服從均勻分布,利用某種函數的映射關系將數據分到有限數量的桶里,每個桶再分別排序(有可能再使用別的排序演算法或是以遞歸方式繼續使用桶排序)。
桶排序利用函數的映射關系,減少了幾乎所有的比較工作。實際上,桶排序的f(k)值的計算,其作用就相當於快排中劃分,已經把大量數據分割成了基本有序的數據塊(桶)。然後只需要對桶中的少量數據做排序即可。

常見的數據元素一般是由若干位組成的,比如字元串由若干字元組成,整數由若干位0~9數字組成。基數排序按照從右往左的順序,依次將每一位都當做一次關鍵字,然後按照該關鍵字對數組排序,同時每一輪排序都基於上輪排序後的結果;當我們將所有的位排序後,整個數組就達到有序狀態。基數排序不是基於比較的演算法。
基數是什麼意思?對於十進制整數,每一位都只可能是0~9中的某一個,總共10種可能。那10就是它的基,同理二進制數字的基為2;對於字元串,如果它使用的是8位的擴展ASCII字元集,那麼它的基就是256。

基數排序 vs 計數排序 vs 桶排序

基數排序有兩種方法:
MSD 從高位開始進行排序
LSD 從低位開始進行排序
這三種排序演算法都利用了桶的概念,但對桶的使用方法上有明顯差異:
基數排序:根據鍵值的每位數字來分配桶
計數排序:每個桶只存儲單一鍵值
桶排序:每個桶存儲一定范圍的數值

有時,待排序的文件很大,計算機內存不能容納整個文件,這時候對文件就不能使用內部排序了(我們一般的排序都是在內存中做的,所以稱之為內部排序,而外部排序是指待排序的內容不能在內存中一下子完成,它需要做內外存的內容交換),外部排序常採用的排序方法也是歸並排序,這種歸並方法由兩個不同的階段組成:
採用適當的內部排序方法對輸入文件的每個片段進行排序,將排好序的片段(成為歸並段)寫到外部存儲器中(通常由一個可用的磁碟作為臨時緩沖區),這樣臨時緩沖區中的每個歸並段的內容是有序的。
利用歸並演算法,歸並第一階段生成的歸並段,直到只剩下一個歸並段為止。

例如要對外存中4500個記錄進行歸並,而內存大小隻能容納750個記錄,在第一階段,我們可以每次讀取750個記錄進行排序,這樣可以分六次讀取,進行排序,可以得到六個有序的歸並段
每個歸並段的大小是750個記錄,並將這些歸並段全部寫到臨時緩沖區(由一個可用的磁碟充當)內了,這是第一步的排序結果。
完成第二步該怎麼做呢?這時候歸並演算法就有用處了。

⑦ 堆排序與快速排序時間效率的一點問題

首先快排最適合用來排序完全隨機的數據,此時不存在退化情況(只要不是人品極差,或者可以隨機選擇主元規避退化情況)。其次,雖然三者的漸進運行時間都是O(nlgn),但隱藏在O里的系數快排是最小的。再次,快排和堆排是原址(in place)的,這一點歸並在運行時還要負擔額外的內存開銷。故快排總體表現是最穩定的,也是工業上使用最為廣泛的排序之一。

⑧ 實現快排、堆排與歸並排序並比較演算法性能

我用java總共寫了五種排序演算法。

同時裡面有一個時間的介面,可以調用,用來查看時間性能

注意其中快速排序實現了四種方法

⑨ 為什麼快速排序比堆排序快呢

一般情況下,快速排序效率要高於堆排序。因為堆排序的常數較大(不過也是1~2之間吧)。
快速排序的平均時間復雜度是O(1.39nlogn)。一般來說,除非有需要絕對保證不能出現O(n^2)的要求,不使用堆排。
堆排序需要有效的隨機存取。

⑩ 關於快速排序演算法的穩定性是什麼

快速排序演算法的穩定性是什麼:假定在待排序的記錄序列中,存在多個具有相同的關鍵字的記錄,若經過排序,這些記錄的相對次序保持不變,即在原序列中,r[i]=r[j],且r[i]在r[j]之前,而在排序後的序列中,r[i]仍在r[j]之前,則稱這種排序演算法是穩定的;否則稱為不穩定的。

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

詳細解釋:

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

首先,排序演算法的穩定性大家應該都知道,通俗地講就是能保證排序前2個相等的數其在序列的前後位置順序和排序後它們兩個的前後位置順序相同。在簡單形式化一下,如果Ai = Aj, Ai原來在位置前,排序後Ai還是要在Aj位置前。

其次,說一下穩定性的好處。排序演算法如果是穩定的,那麼從一個鍵上排序,然後再從另一個鍵上排序,第一個鍵排序的結果可以為第二個鍵排序所用。基數排序就 是這樣,先按低位排序,逐次按高位排序,低位相同的元素其順序再高位也相同時是不會改變的。

以上內容參考網路—排序演算法穩定性

閱讀全文

與快排堆排演算法相關的資料

熱點內容
自己購買雲主伺服器推薦 瀏覽:419
個人所得稅java 瀏覽:761
多餘的伺服器滑道還有什麼用 瀏覽:189
pdf劈開合並 瀏覽:26
不能修改的pdf 瀏覽:750
同城公眾源碼 瀏覽:488
一個伺服器2個埠怎麼映射 瀏覽:297
java字元串ascii碼 瀏覽:78
台灣雲伺服器怎麼租伺服器 瀏覽:475
旅遊手機網站源碼 瀏覽:332
android關聯表 瀏覽:945
安卓導航無聲音怎麼維修 瀏覽:332
app怎麼裝視頻 瀏覽:430
安卓系統下的軟體怎麼移到桌面 瀏覽:96
windows拷貝到linux 瀏覽:772
mdr軟體解壓和別人不一樣 瀏覽:904
單片機串列通信有什麼好處 瀏覽:340
游戲開發程序員書籍 瀏覽:860
pdf中圖片修改 瀏覽:288
匯編編譯後 瀏覽:491