常用排序演算法之快速排序

2022-04-10 09:57:16 字數 2327 閱讀 9370

快速排序最壞情況執行時間為o(n2),但實際中通常都是用於排序的最佳的實用選擇,因為其平均效能相當好:期望的執行時間為o(nlgn),且o(nlgn)記號中隱含的常數因子很小。

快速排序是一種就地排序。同時,是一種不穩定的排序。本文內容主要參照演算法導論。

快速排序主要利用了分治的思想。一般分為三步進行:

分解:陣列a[p..r]被劃分為兩個子陣列a[p..q-1]和a[q+1..r],其中a[p..q-1]的元素都小於等於a[q],a[q+1..r]都大於等於a[q]。

解決:通過遞迴呼叫快速排序,對子陣列a[p..q-1]和a[q+1..r]排序。

合併:因為兩個子陣列是就地排序的,將它們合併不需要額外操作,整個陣列已經是排好序的。

下面是快速排序的c語言**:

1

int quicksort(int *a,int p, intr)2

10 }

快速排序的關鍵是partition過程,它對子陣列a[p..r]進行就地排序,**如下:

1

int partition(int *a,int p, intr)2

16}17int

temp; //最後一步,將主元放到合適的位置,因為此處選取的主元的第乙個元素,而i所指向的是最後乙個小於等於主元的元素,因此交換主元和i元素,

使得a[p..q-1]的元素都小於等於a[q],a[q+1..r]都大於等於a[q]

18 temp=a[p];

19 a[p]=a[i];

20 a[i]=temp;

21return

i;22 }

下圖左邊描述了快排的partition過程,圖中主元選取的是最後乙個元素跟上述**不一樣,不過這沒關係。右邊是快速排序的動態演示。

始終記住,i是小於和大於主元的分界線,二j是已處理和未處理的分界線,即i前面的元素都是小於等於主元,而i+1到j都是大於等於主元的元素,j之後的元素是還沒比較的元素。

最後,貼上我在devc++裡寫的完整**:

1 #include 2 #include 3

using

namespace

std;45

int quicksort(int *a,int p, int

r);6

int partition(int *a,int p, int

r);7

8int

main()

919 quicksort(a,0,n-1

);20

for(i=0;i)

2125 cout<

26delete a;

27 system("

pause");

28return0;

29}3031

int quicksort(int *a,int p, int

r)3240}

4142

int partition(int *a,int p, int

r)4357}

58int

temp;

59 temp=a[p];

60 a[p]=a[i];

61 a[i]=temp;

62return

i;63 }

另外,快排還有一種典型的實現方法,就是霍爾快排,維基百科上介紹的快速排序就是這種實現。下面貼上維基百科的霍爾快排:

1

void swap(int *x, int *y)

6void quick_sort_recursive(int arr, int start, int

end)

18if (arr[left] >=arr[end])

19 swap(&arr[left], &arr[end]);

20else

21 left++;

22 quick_sort_recursive(arr, start, left - 1

);23 quick_sort_recursive(arr, left + 1

, end);24}

25void quick_sort(int arr, int

len)

view code

常用排序演算法之快速排序

快速排序 快速排序也是一種分治的遞迴演算法。取陣列s中任一元素v,作為樞紐元。用樞紐元將s中的元素分成倆部分,對這兩部分分別再次進行快速排序。當s中元素個數是0或1時,則返回。因為快速排序要根據樞紐元將元素分成倆部分,因此,樞紐元的選取對程式的時間複雜度是有影響的。一般的樞紐元選取策略是取左端 右端...

常用演算法之快速排序

演算法對開發的重要性不言而喻,所以準備記錄一些常用演算法。本篇文章先介紹一下快速排序演算法。這是在實際中最常用的一種排序演算法,速度快,效率高。快速排序是非常優秀的排序演算法。它是由是c.r.a.hoare於1962年提出的一種劃分交換排序。它採用了一種分治的策略,屬於分治法 divide and ...

排序演算法之快速排序

快速排序使用分治法 divide and conquer 策略來把乙個序列 list 分為兩個子串行 sub lists 步驟為 從數列中挑出乙個元素,稱為 基準 pivot 重新排序數列,所有元素比基準值小的擺放在基準前面,所有元素比基準值大的擺在基準的後面 相同的數可以到任一邊 在這個分割槽退出...