編寫乙份快速排序,完成對元素序列37,19,43,22,22,89,26,92按照從小到大順序排列。
【演算法思想】
快速排序是氣泡排序演算法的改進,也屬於交換型別的排序演算法,它的基本思想描述如下:
(1)從第j個元素開始向前依次將每個元素與樞軸元素pivot比較。如果當前元素大於pivot,則比較前乙個元素與pivot,即比較a[j-1]與pivot;否則,將當前元素移動到第i個位置並轉步驟(2)執行。
(2)從第i個元素開始向後依次將每個元素與樞軸元素pivot比較。如果當前元素小於pivot,則比較後乙個元素與pivot,即比較a[i+1]與pivot;否則,將當前元素移動到第j個位置並轉步驟(3)執行。
(3)重複執行(1)和(2),直到i≥j,將元素pivot移動到a[i]中。此時整個元素序列被劃分兩個部分:小於a[i]元素位於第i個位置之前,大於等於a[i]的元素位於第i個位置之後。這樣就完成了一趟快速排序,即一次劃分。
按照以上方法,對於每個部分(子表)進行類似的劃分操作,直到每個子表只有乙個元素為止,這樣整個序列就構成了乙個有序的序列。
例如,乙個元素序列為37,19,22,22,89,26,92,根據快速排序演算法思想,第一次劃分過程如下圖所示。
從上圖可以看出,當一趟快速排序完畢後,整個元素序列被樞軸元素的關鍵字37劃分為兩個子表,左邊子表的元素值都小於37,右邊子表的元素值大於等於37。使用快速排序對前面的元素序列進行排序的整個過程如下圖所示。
通過上面的排序過程不難看出,快速排序演算法可以通過遞迴呼叫實現,排序過程其實是不斷地對元素序列盡心劃分,直到每乙個部分不能劃分時,即完成快速排序。
code:
#includevoid disparray(int a, int n);
void disparray2(int a, int n, int pivot, int count);
void qsort(int a, int n, int low, int high);
void quicksort(int a, int n);
int partition(int a, int low, int high);
void qsort(int a, int n, int low, int high)
/*利用快速排序演算法對陣列a中的元素排序*/
{ int pivot;
int static count = 1;
if (low= pivot)/*從表的末端向前掃瞄*/
【主要用途】
快速排序是氣泡排序演算法的改進,實現比較複雜,它的主要用途是在需要對大量資料盡心排序的情況,它的時間效率要遠高於氣泡排序,在處理資料量特別大的情況下效果明顯。
【穩定性和複雜度】
快速排序是一種不穩定的排序演算法,在最好的情況下,每趟排序都是將元素序列正好劃分為兩個等長的子串行。這樣,快速排序子串行的劃分過程就是建立完全二叉樹的過程,劃分的次數等於樹的深度,即log2 n,因此快速排序總的比較次數為 t(n)≤n+2t(n/2)≤n+2*(n/2+2*t(n/4))=2n+4t(n/4)≤3n+8t(n/8)≤...≤nlog2 n+nt(1)。因此在最好的情況下時間複雜度為o(nlogn)
在最壞的情況下,待排序元素已經是有序的,則時間的花費主要集中在元素的比較次數上。第一趟需要比較n-1次,第二趟需要比較n-2次,以此類推,共需要比較n(n-1)/2次,因此時間複雜度為o(n^2)。
平均情況下,快速排序的時間負責度為o(nlog2 n),空間複雜度為o(log2 n)
排序演算法 4 快速排序
快速排序法是對氣泡排序的一種改進,本來是要和氣泡排序寫在乙個文章裡的,不過前兩天剛開始在遞迴呼叫的時候沒有完全理解,昨天晚上google了一把發現原來自己理解錯了,我看的這個教材沒有寫清楚,今天早上除錯了一把終於成功。快速排序演算法的基本思想是 通過一趟排序將要排序的資料分割成獨立的兩部分,其中一部...
排序演算法 4 快速排序
快速排序是由東尼 霍爾所發展的一種排序演算法。在平均狀況下,排序 n 個專案要 nlogn 次比較。在最壞狀況下則需要 n2 次比較,但這種狀況並不常見。事實上,快速排序通常明顯比其他 nlogn 演算法更快,因為它的內部迴圈 inner loop 可以在大部分的架構上很有效率地被實現出來。快速排序...
演算法 4 快速排序
從圖中我們可以看到 left指標,right指標,base參照數。其實思想是蠻簡單的,就是通過第一遍的遍歷 讓left和right指標重合 來找到陣列的切割點。第一步 首先我們從陣列的left位置取出該數 20 作為基準 base 參照物。第二步 從陣列的right位置向前找,一直找到比 base ...