排序 快速排序 收藏

2021-08-24 19:35:12 字數 1236 閱讀 1067

之前總以為自己已經掌握了快速排序,可是眼高手低,沒有好好研究一下它是否是穩定的排序,以及涉及重複元素等問題,最近用到時總是出現小的bug,於是又潛心翻看《演算法導論》,經過測試,寫出乙個正確的快速排序演算法。

寫正確關鍵在於paration函式:

(1)如果s<=k<=i,則有a[k]<=m(中樞元素)

(2)如果i+1<=k<=j-1,則有a[i]>m

(3)如果k=e,則有a[k]=x

變數s和e分別表示陣列a的起始和結尾元素,i用於跟蹤j,直到遇到》中樞元素m的值,此時a[i+1]>m,等待下次(如果存在)遇到<=中樞元素m的知,然後交換。

注意:在paration()函式中選擇隨機中樞元素時,必須基於當前s值(即在當前s上加上隨機值)。

view plaincopy to clipboardprint?

1 #include

2 #include

3 #include

4 void quite_sort(int *,int,int);

5 int paration(int*,int,int);

6 void print(int*,int );

7 void swap(int*,int* );

8 int main()

9 ;

11 quite_sort(a,0,7);

12 print(a,8);

13 14 //int b=;

15 //quite_sort(b,0,5);

16 //print(b,6);

17 18 //int c=;

19 //quite_sort(c,0,3);

20 //print(c,4);

21 22 }

23 void print(int *a,int len)

24 ;

11 quite_sort(a,0,7);

12 print(a,8);

13 14 //int b=;

15 //quite_sort(b,0,5);

16 //print(b,6);

17 18 //int c=;

19 //quite_sort(c,0,3);

20 //print(c,4);

21 22 }

23 void print(int *a,int len)

24

54 return l;

55 }

排序 快速排序

快速排序時實踐中最快的一直排序,平均時間是0 nlogn 最壞的情況是o n2 但是很容易將這種情況避免 空間複雜度 o n lgn 不穩定。快速排序時基於分治模式處理的,對乙個典型子陣列a p.r 排序的分治過程為三個步驟 1.分解 a p.r 被劃分為倆個 可能空 的子陣列a p q 1 和a ...

排序 快速排序

定義 在快速排序演算法中,使用了分治策略,將要排序的序列分成兩個子串行,然後遞迴地對子序列進行排序,直到整個序列排序完畢。步驟 1.在序列中選擇乙個關鍵元素作為軸 2.對序列進行重新排序,將比軸小的元素移到軸的前邊,比軸大的元素移動到軸的後面。在進行劃分之後,軸便在它最終的位置上 3.遞迴地對兩個子...

排序 快速排序

時間複雜度 快速排序每次將待排序陣列分為兩個部分 1 在理想狀況下,每一次都將待排序陣列劃分成等長兩個部分,則需要logn次劃分。2 在最壞情況下,即陣列已經有序或大致有序的情況下,每次劃分只能減少乙個元素,快速排序將不幸退化為氣泡排序,最壞情況為o n 2 快速排序的平均時間複雜度為o nlogn...