對於n個任意數的排序,我們現在只通過比較大小的方式來對其進行排序。
我們知道這個排序問題的時間複雜度的下限是nln(n),也就是說對於任意的基於比較的方式來排序的演算法,不可能有時間複雜度小於nln(n)的排序方法。
那麼這個下界是如何的出來的呢?
考慮n個數的大小排列方式,一共有n!種排列。
不用考慮這n個數有相同的情況,那樣只會使排列數量小於n!,再者,我們排序如果要保持相同數字的順序,也就是相同的數在原數列裡下標跟小的,在新數列裡仍然排在前面,那麼我們就要對相同的數也做分辨,那樣的排列數是n!而我們的排序演算法其本質就是來分辨我們的陣列是屬於哪一種大小排列方式,只要分辨出了我們的陣列是屬於哪一種大小排列方式,我們自然就將數列排好序了。
例如對於3個數的排序,他可能的大小排列順序由如下6種:
123,132,213,231,312,321。
那麼對於陣列[9,29,6],我們其實只要分辨出他是上面6種情況的哪一種就能夠得到他的正確的排序了,所以排序實際上是做選擇題的過程。
然後當我們使用比較排序的時候,每一次的比較要麼是大於,要麼是小於,最好的情況下一次比較可以排除一般的答案,因為我們事先並不知道這次比較的結果。那麼假設我們想要只剩下乙個答案,也就是排序完成,比較的次數為x,那麼有如下不等式:
n!/(2的x次方)<1
x>log2(n!)
然後根據斯特林公式可以得出x>nln(n)(常數忽略了)。
其實還能夠這樣理解,我們要分辨n!種情況,而一次比較只能分辨出兩種情況,而要分辨出n!種情況,就需要:
2的x次方》n!
注意,我們這樣得到的只是比較排序的理論下界,但並不代表一定存在這樣的比較排序法,當然,二叉樹排序就是乙個基於比較的時間複雜度是nln(n)的排序演算法。
讀者可以用這個辦法來考慮下n-1個0和乙個1的陣列的排序,就能理解這種計算算出來的下界世界上不一定能夠取到。
比較排序 氣泡排序 插入排序 比較排序
以下排序都以從小到大排序為例 1.氣泡排序 氣泡排序就是從第乙個元素開始,對每乙個元素與它之後所有的元素進行比較,將較小的乙個放在前,大的放在後 氣泡排序兩層迴圈 一般排序都是兩層迴圈 內層迴圈有兩種寫法,形式稍稍不同,但排序結果相同 第一種for int i 0 ia j for int j 0 ...
討論 兩種迴圈方式的比較
c 語言中兩 種常用迴圈方式及對應彙編 1 x86 彙編 83 int sum 0x10 0040b8e8movdword ptr ebp 4 10h 84 for int i 0 i sum i 0040b8efmovdword ptr ebp 8 0 0040b8f6jmpmain 31h 00...
排序演算法的比較
快排和歸併 1.思想 都使用了分治的思路。歸併是先區域性有序再組合起來,快排是先大體有序 前半部分小於某個數,後半部分大於某個數 在區域性排好。2.時間複雜度 歸併是嚴格的nlogn 快排平均時間複雜度nlogn 因為標桿的數不一定是在最中間 最壞有可能退化到n 2。3.空間複雜度 歸併需要額外乙個...