演算法快排
1. 快速排序的演算法復雜度分析
原文地址:
快速排序的演算法復雜度分析
以下是快排的java演算法:
大家都知道快排的時間復雜度是O(n*ln[n]),那麼這個復雜度是如何計算出來的呢?
最好的情況下,每次劃分對一個記錄定位後,要記錄的左側子序列與右側子序列的長度相同。在具有n個記錄的序列中,一次劃分需要對整個待劃分序列掃描一遍,所需的時間為O(n)。
設 是對n個記錄的序列進行排序的時間,每次劃分後,正好把劃分區域分為長度相等的連個子序列,顯然T(0)=T(1) =1,則有:
最壞的情況下,待排序的記錄序列正序或逆序,每次劃分只能得到一個比上一次劃分少一個記錄的子序列,(另一個子序列為空)。此時,必須經過n-1次遞歸調用才能把所有記錄定位,而且第i趟劃分需要經過n-i次比較才能找個才能找到第i個記錄的位置,因此時間復雜度為
平均情況下,設軸值記錄的關鍵碼第k小(1≤k≤n),則有:
由上式可推出如下兩式:
兩式相減,然後兩邊同除以n(n+1)得
又因為f(n)單調遞減,單調有界數列極限定理,所以f(n)有界
此數稱為歐拉常數,
約為 0.57721566490153286060651209
所以
所以
**如果有何處不當,請不吝賜教,一定多加完善。謝謝 **
參考資料:
【1】《演算法設計與分析》第二版 王紅梅
2. 快排演算法是什麼意思
快速排序,外文名Quicksort,計算機科學,適用領域Pascal,c++等語言,是對冒泡排序演算法的一種改進。
原理:
設要排序的數組是A[0]……A[N-1],首先任意選取一個數據(通常選用數組的第一個數)作為關鍵數據,然後將所有比它小的數都放到它左邊,所有比它大的數都放到它右邊,這個過程稱為一趟快速排序。
性能分析:
快速排序的一次劃分演算法從兩頭交替搜索,直到low和hight重合,因此其時間復雜度是O(n);而整個快速排序演算法的時間復雜度與劃分的趟數有關。
理想的情況是,每次劃分所選擇的中間數恰好將當前序列幾乎等分,經過log2n趟劃分,便可得到長度為1的子表。這樣,整個演算法的時間復雜度為O(nlog2n)。
以上內容參考:網路——快排演算法
3. 快排演算法每趟需要花費多少輔助空間
每趟排舉襪盯序需要一個輔助空間,輔助空間和趟數有關正和,最好情況是log2n ,最差的情況是n。
快速排序由C. A. R. Hoare在1960年提出。
它的基本思想是:通過一趟排序將要排序的數據分割好碰成獨立的兩部分,其中一部分的所有數據都比另外一部分的所有數據都要小,然後再按此方法對這兩部分數據分別進行快速排序,整個排序過程可以遞歸進行,以此達到整個數據變成有序序列。
(3)演算法快排擴展閱讀
一趟快速排序的演算法是:
1、設置兩個變數i、j,排序開始的時候:i=0,j=N-1;
2、以第一個數組元素作為關鍵數據,賦值給key,即key=A[0];
3、從j開始向前搜索,即由後開始向前搜索(j--),找到第一個小於key的值A[j],將A[j]和A[i]的值交換;
4、從i開始向後搜索,即由前開始向後搜索(i++),找到第一個大於key的A[i],將A[i]和A[j]的值交換;
5、重復第3、4步,直到i=j; (3,4步中,沒找到符合條件的值,即3中A[j]不小於key,4中A[i]不大於key的時候改變j、i的值,使得j=j-1,i=i+1,直至找到為止。
找到符合條件的值,進行交換的時候i, j指針位置不變。另外,i==j這一過程一定正好是i+或j-完成的時候,此時令循環結束)。
4. 快速排序和冒泡排序演算法
此前由於自己對快速排序演算法的認識不夠,現在重新學習一遍,加深自己的認識。
快速排序演算法是對冒泡演算法的一種改進,大家都知道,冒泡排序是比較相鄰元素的大小,而快速排序則在冒泡排序的基礎上將數組分為兩部分,在分別對他們進行排序,通過遞歸實現。
冒泡排序的實現過程:
快速排序的思想是在一個需要排序的數組A中首先選取一個數據(通常選用數組的第一個數)作為關鍵數據,然後將所有比它小的樹都放到它左邊,所有比它大的數都放到它右邊,這個過程稱為一趟快速排序。值得注意的是,快速排序不是一種穩定的排序演算法。
一般快速排序的演算法是:
快速排序實現過程:
總結:快速排序和冒泡排序各有優缺點,不過快排時間復雜度是o(nlogn),而冒牌排序在最壞的情況下的時間復雜度是o(n2),所以快速排序在提升效率上快了不少。