快速排序最壞情況執行時間為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快速排序的關鍵是partition過程,它對子陣列a[p..r]進行就地排序,**如下:int quicksort(int *a,int p, intr)2
10 }
1下圖左邊描述了快排的partition過程,圖中主元選取的是最後乙個元素跟上述**不一樣,不過這沒關係。右邊是快速排序的動態演示。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 }
始終記住,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 }
1view codevoid 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)
常用排序演算法之快速排序
快速排序 快速排序也是一種分治的遞迴演算法。取陣列s中任一元素v,作為樞紐元。用樞紐元將s中的元素分成倆部分,對這兩部分分別再次進行快速排序。當s中元素個數是0或1時,則返回。因為快速排序要根據樞紐元將元素分成倆部分,因此,樞紐元的選取對程式的時間複雜度是有影響的。一般的樞紐元選取策略是取左端 右端...
常用演算法之快速排序
演算法對開發的重要性不言而喻,所以準備記錄一些常用演算法。本篇文章先介紹一下快速排序演算法。這是在實際中最常用的一種排序演算法,速度快,效率高。快速排序是非常優秀的排序演算法。它是由是c.r.a.hoare於1962年提出的一種劃分交換排序。它採用了一種分治的策略,屬於分治法 divide and ...
排序演算法之快速排序
快速排序使用分治法 divide and conquer 策略來把乙個序列 list 分為兩個子串行 sub lists 步驟為 從數列中挑出乙個元素,稱為 基準 pivot 重新排序數列,所有元素比基準值小的擺放在基準前面,所有元素比基準值大的擺在基準的後面 相同的數可以到任一邊 在這個分割槽退出...