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

2021-03-26 12:22:36 字數 5209 閱讀 3628

1樓:匿名使用者

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

2樓:匿名使用者

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

3樓:下個倒角

每種排序都有它的優勢。

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

4樓:琳瓏的林

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

5樓:東邪簫醉

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

內是1~2之間容吧)。

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

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

6樓:匿名使用者

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

7樓:哈孤

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

對於那個排序技術中的快速排序法,在最壞的情況下是o(nlog2n),這個o是什麼,還有能解釋一下這個資料是

8樓:風箏

o是表示bai最大近似的意思(

du個人理解),書上嚴格zhi定義我忘了,dao假如說時間複雜度是o(n)的話,專一般屬

情況下語句塊的執行次數就是n。

快排在有序情況下複雜度退化到o(n~2),因為快排每次都是選定乙個軸值,把資料按軸值分成兩部分,這個軸值一般取第乙個資料,當有序情況下,每次需要排序的資料都在軸值的一邊,總共要拍n次

關於排序的說法正確的是( ).(多選題)

9樓:匿名使用者

acdb中,希爾複雜度是o(m*n)

e中,歸併是穩定的~

二分法插入排序 快速排序 歸併排序 堆排序 的時間複雜度分別是多少?

10樓:carry_小小

二分法插入排序 複雜度 o(nlogn)

快速排序 o(nlogn) 有可能退化歸併排序 o(nlogn) 比較快

堆排序 o(nlogn)最穩定的

11樓:匿名使用者

排序演算法

所謂排序,就是使一串記錄,按照其中的某個或某些關鍵字的大小,遞增或遞減的排列起來的操作。 分類 在電腦科學所使用的排序演算法通常被分類為: 計算的複雜度(最差、平均、和最好表現),依據串列(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)

如果使用最佳的現在版本 ***b sort — o(n log n)

堆排序 (heapsort)— o(n log n) **oothsort — 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)

12樓:匿名使用者

排序算琺 時間複雜度 優點 缺點

簡單排序 o(n^2) 編寫方便 執丨行時間長

快排 o(nlbn) 執丨行時間短 很差情況下執丨行時間長、占用記憶體多

堆排序 o(nlbn) 執丨行時間短 編寫有點麻煩,有較差的情況

計數排序 o(n+m) 編寫方便,取值範圍小時很高效 取值範圍大時效率低、易超記憶體限丨制

歸併排序 o(nlbn) 穩定的排序算琺,無較差情況 占用記憶體很大

快速排序方法的簡單解釋快速排序方法的時間複雜度為On2nn

快速排序的原理和實現 純白話文口述 看看這個部落格,講的很透徹,通俗易懂,望對你有用 快排的bai思想是 假設都是從du小到大排列 選一zhi個值作為 軸dao值 所有小於軸值的都移動內到軸值左邊容,所有大於軸值的都移動到軸值右邊。這一步是讓數列變得較為有序 然後分別再對軸值的左邊 右邊分別進行快排...

C語言快速排序比較次數問題c語言,快速排序,在最壞條件下需要比較的次數為多少

你可以用氣泡排序法自己試一試 目的 按要求從大到小或從小到大排序。基本思路 對尚未排序的各元素從頭到尾依次依次比較相鄰的兩個元素是否逆序 與欲排順序相反 若逆序就交換這兩元素,經過第一輪比較排序後便可把最大 或最小 的元素排好,然後再用同樣的方法把剩下的元素逐個進行比較,就得到了你所要的順序。可以看...

冒泡法和選擇排序,氣泡排序與選擇排序有什麼區別

冒泡和快速排序的區別在於 冒泡演算法,每次比較如果發現較小的元素在後面,就交換兩個相鄰的元素。將待排序的元素看作是豎著排列的 氣泡 較小的元素比較輕,從而要往上浮。在氣泡排序演算法中我們要對這個 氣泡 序列處理若干遍。所謂一遍處理,就是自底向上檢查一遍這個序列,並時刻注意兩個相鄰的元素的順序是否正確...