為什麼快速排序比堆排序快呢,為什麼快速排序在陣列的情況下比歸併排序快

2021-03-04 09:00:33 字數 5314 閱讀 4723

1樓:琳瓏的林

因為推排抄中有大量無效的操作,比如將最末尾元素移動到堆首,必須要有後續操作再移動此時堆首的元素,這樣會增加資料的無序度;但是快排不一樣,快排沒有無用操作,每一次交換都會使資料更加有序。而且堆排是跳躍訪問,快排是區域性順序訪問,這兩者的速度實際上是不一樣的,當資料量增大差距就明顯了

2樓:東邪簫醉

一般情bai況下,快速排序效du率要高於堆排序zhi。因為堆dao排序的常數較大(不過也

內是1~2之間容吧)。

快速排序的平均時間複雜度是o(1.39nlogn)。一般來說,除非有需要絕對保證不能出現o(n^2)的要求,不使用堆排。

堆排序需要有效的隨機訪問。

3樓:匿名使用者

你去看看c語言自帶的sort 排序函式吧,藐視也是快排,建議你去看看什麼是分攤準則,在小資料的情況下,選擇快排比較好,不是 什麼完爆不完爆的問題 大哥

4樓:哈孤

資料結構我不大記得了,不過實際使用是用快速排序的話可能是開發人員的喜歡,歷史版本的統一,或者是以硬體換速度吧。

快速排序,希爾排序和堆排序的平均時間複雜度都是o(nlog2n),為什麼說快速排序是最快的?

5樓:匿名使用者

快速排序是用遞迴的思想,用棧來儲存資料,它第n趟最多要確定2^n個數的最終位置。它使用的空間是最多的,用空間換取了時間。例如:

6樓:匿名使用者

快排只是內排序演算法啊,而且在內排序中也並不是最快的,只是快排在大多數情況下效果很好,因為一般的無序元素不會是完全或者近似倒序的。

7樓:下個倒角

每種排序都有它的優勢。

為什麼快速排序在陣列的情況下比歸併排序快

8樓:奔跑吧皮皮蝦

是歸併排序,我剛剛也做

這個題目。 因為堆排序時間複雜度為n*logn,空間複雜度為1,是不穩定排序,適合較多情況; 而歸併排序的時間複雜度為n*logn,空間複雜度為n,是穩定排序。 快速排序的時間複雜度為n,空間複雜度最好的情況是logn

9樓:墨易展寒煙

首先你說歸併排序最壞的情形為o(nlogn),這是不正確的歸併排序如果不借助輔助空間的話,複雜度為o(n^2),借助的話就是o(nlogn)(o(nlog2n))歸併排序

平均複雜度是

o(nlogn)

比較快快速排序快速排序的最壞情況基於每次劃分對主元的選擇。基本的快速排序選取第乙個元素作為主元。這樣在陣列已經有序的情況下,每次劃分將得到最壞的結果。

一種比較常見的優化方法是隨機化演算法,即隨機選取乙個元素作為主元。這種情況下雖然最壞情況仍然是o(n^2),但最壞情況不再依賴於輸入資料,而是由於隨機函式取值不佳。實際上,隨機化快速排序得到理論最壞情況的可能性僅為1/(2^n)。

所以隨機化快速排序可以對於絕大多數輸入資料達到o(nlogn)的期望時間複雜度。一位前輩做出了乙個精闢的總結:「隨機化快速排序可以滿足乙個人一輩子的人品需求。

」隨機化快速排序的唯一缺點在於,一旦輸入資料中有很多的相同資料,隨機化的效果將直接減弱。對於極限情況,即對於n個相同的數排序,隨機化快速排序的時間複雜度將毫無疑問的降低到o(n^2)。解決方法是用一種方法進行掃瞄,使沒有交換的情況下主元保留在原位置。

綜合來說快速排序速度最快,時間複雜度最小。希望對你有所幫助!

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

10樓:沉珂側畔

歸併排序是穩定的「快速排序和堆排序都不穩定.不穩定:就是大小相同的兩個數,經過排序後,最終位置與初始位置交換了。

快速排序:

27 23 27 3

以第乙個27作為pivot中心點,則27與後面那個3交換,形成

3 23 27 27,排序經過一次結束,但最後那個27在排序之初先於初始位置3那個27,所以不穩定。

堆排序:

比如:3 27 36 27,

如果堆頂3先輸出,則,第三層的27(最後乙個27)跑到堆頂,然後堆穩定,繼續輸出堆頂,是剛才那個27,這樣說明後面的27先於第二個位置的27輸出,不穩定。」

「2 歸併排序(mergesort)

歸併排序先分解要排序的序列,從1分成2,2分成4,依次分解,當分解到只有1個一組的時候,就可以排序這些分組,然後依次合併回原來的序列中,這樣就可以排序所有資料。合併排序比堆排序稍微快一點,但是需要比堆排序多一倍的記憶體空間,因為它需要乙個額外的陣列。」

以ai與aj為例子

快速排序有兩個方向,左邊的i下標一直往右走,當a[i] <= a[center_index],其中center_index樞元素的陣列下標,一般取為陣列第0個元素。而右邊的j下標一直往左走,當a[j] > a[center_indexij都走不動了,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]交換的時刻。

在快速排序, 堆排序,歸併排序中 哪個是最穩定的排序方法? 20

11樓:匿名使用者

1 快速排序(quicksort)

快速排序是乙個就地排序,分而治之,大規模遞迴的演算法。

從本質上來說,它是歸併排序的就地版本。快速排序可以由下面四步組成。

(1) 如果不多於1個資料,直接返回。

(2) 一般選擇序列最左邊的值作為支點資料。

(3) 將序列分成2部分,一部分都大於支點資料,另外一部分都小於支點資料。

(4) 對兩邊利用遞迴排序數列。

快速排序比大部分排序演算法都要快。儘管我們可以在某些特殊的情況下寫出比快速排序快的演算法,但是就通常情況而言,沒有比它更快的了。快速排序是遞迴的,對於記憶體非常有限的機器來說,它不是乙個好的選擇。

2 歸併排序(mergesort)

歸併排序先分解要排序的序列,從1分成2,2分成4,依次分解,當分解到只有1個一組的時候,就可以排序這些分組,然後依次合併回原來的序列中,這樣就可以排序所有資料。合併排序比堆排序稍微快一點,但是需要比堆排序多一倍的記憶體空間,因為它需要乙個額外的陣列。

3 堆排序(heapsort)

堆排序適合於資料量非常大的場合(百萬資料)。

堆排序不需要大量的遞迴或者多維的暫存陣列。這對於資料量非常巨大的序列是合適的。比如超過數百萬條記錄,因為快速排序,歸併排序都使用遞迴來設計演算法,在資料量非常大的時候,可能會發生堆疊溢位錯誤。

堆排序會將所有的資料建成乙個堆,最大的資料在堆頂,然後將堆頂資料和序列的最後乙個資料交換。接下來再次重建堆,交換資料,依次下去,就可以排序所有的資料。

4 shell排序(shellsort)

shell排序通過將資料分成不同的組,先對每一組進行排序,然後再對所有的元素進行一次插入排序,以減少資料交換和移動的次數。平均效率是o(nlogn)。其中分組的合理性會對演算法產生重要的影響。

現在多用d.e.knuth的分組方法。

shell排序比氣泡排序快5倍,比插入排序大致快2倍。shell排序比起quicksort,mergesort,heapsort慢很多。但是它相對比較簡單,它適合於資料量在5000以下並且速度並不是特別重要的場合。

它對於資料量較小的數列重複排序是非常好的。

5 插入排序(insertsort)

插入排序通過把序列中的值插入乙個已經排序好的序列中,直到該序列的結束。插入排序是對氣泡排序的改進。它比氣泡排序快2倍。

一般不用在資料大於1000的場合下使用插入排序,或者重複排序超過200資料項的序列。

6 氣泡排序(bubblesort)

氣泡排序是最慢的排序演算法。在實際運用中它是效率最低的演算法。它通過一趟又一趟地比較陣列中的每乙個元素,使較大的資料下沉,較小的資料上公升。它是o(n^2)的演算法。

7 交換排序(exchangesort)和選擇排序(selectsort)

這兩種排序方法都是交換方法的排序演算法,效率都是 o(n2)。在實際應用中處於和氣泡排序基本相同的地位。它們只是排序演算法發展的初級階段,在實際中使用較少。

8 基數排序(radixsort)

基數排序和通常的排序演算法並不走同樣的路線。它是一種比較新穎的演算法,但是它只能用於整數的排序,如果我們要把同樣的辦法運用到浮點數上,我們必須了解浮點數的儲存格式,並通過特殊的方式將浮點數對映到整數上,然後再對映回去,這是非常麻煩的事情,因此,它的使用同樣也不多。而且,最重要的是,這樣演算法也需要較多的儲存空間。

9 總結

下面是乙個總的**,大致總結了我們常見的所有的排序演算法的特點。

排序法 平均時間 最差情形 穩定度 額外空間 備註

冒泡 o(n2) o(n2) 穩定 o(1) n小時較好

交換 o(n2) o(n2) 不穩定 o(1) n小時較好

選擇 o(n2) o(n2) 不穩定 o(1) n小時較好

插入 o(n2) o(n2) 穩定 o(1) 大部分已排序時較好

基數 o(logrb) o(logrb) 穩定 o(n)

b是真數(0-9),

r是基數(個十百)

shell o(nlogn) o(ns) 1

快速 o(nlogn) o(n2) 不穩定 o(nlogn) n大時較好

歸併 o(nlogn) o(nlogn) 穩定 o(1) n大時較好

堆 o(nlogn) o(nlogn) 不穩定 o(1) n大時較好

12樓:無心字

是歸併排序,我剛剛也做這個題目。

因為堆排序時間複雜度為n*logn,空間複雜度為1,是不穩定排序,適合較多情況;

而歸併排序的時間複雜度為n*logn,空間複雜度為n,是穩定排序。

快速排序的時間複雜度為n,空間複雜度最好的情況是logn,最壞的情況是n^2,是不穩定的排序方法。(書本原話)。

13樓:慶純

堆排序 n*logn 時間在這裡比較優 不過穩定性差快排 o(nlogn),最壞情況為o(n^2)。在實際應用中,快速排序的平均時間複雜度為o(nlogn)。

比較均衡

直接插入排序,簡單選擇排序 n^2

希爾排序和基數排序 不太了解

空間的話 個人認為是一樣的 因為你要用同樣的陣列去存 只是存的順序不同罷了

時間的話 100w以內 快排 最優 100w以上 堆排的優越性就明顯出來了

所以一般快排就可以滿足

戰士為什么比MM厲害呢,戰士為什麼比MM厲害呢?

其實看個人操作,如果玩sf,戰士確實強,但gf還是mm強點,因為戰士需要的點太多,而且雜,每樣都要加,但是mm就不同了,力量能拿起 就可以加敏捷了,在加點智力,給自己加攻擊,加防禦,打架在給自己 基本上,連殺2個戰士都跟玩似的,但是前提要等級不要差太多,0 35級沒啥大問題,但是裝備也要跟戰士一樣的...

為什麼女人比男人老的快呢,為什麼女人比男人老得快?

女人無私些 什麼事情都瞻前顧後的替家人著想,擔心著操心 那肯定就比男人老得快咯!得快與老得慢,其實最有直接關係的是人的心情 心態,一般心情好的人,性格樂觀者就相對要老得慢些,反之就快些 男人婚後老得慢,因為操心少啊,而女人婚後容易老,因為女人善於操心啊.女人生孩子很辛苦的緣故吧,所以說女人的青春很可...

為什么男孩的壓力比女孩大呢,為什麼男孩的壓力比女孩大呢?

原因 1.工作狂 一般人正常工作時間為8 10小時,此為人體健康負荷量。如果長期工作12小時以上,就對人體產生壓力。2.極度失落 由失落感所衍生的情緒反應,會使人產生悲觀 失望 沒有信心,甚至憤世嫉俗的心態。3.難耐高壓。長期處在白熱化競爭的氣氛中,會使他們心理極度緊張 苦悶和失望,導致情緒跌宕。4...