1、算法原理
快速排序(quicksort)是在實踐中最快的已知排序算法,它的平均運行時間是O(NlogN)。該算法之所以特別快,主要是由於非常精煉和高度優化的內部循環。像歸併排序一樣,快速排序也是一種分治的遞歸算法。將數組S排序的基本算法由下列簡單的四步組成:
(1)如果S中元素個數是0或1,則返回。
(2)取S中一個元素v,稱之爲樞紐元(pivot)。
(3)將S-{v}(S中其餘元素)分成兩個不相交的集合:S1={x∈S-{v}|x≤v}和S2={x∈S-{v}|x≥v}。
(4)返回{quicksort(S1)}後,繼隨v,繼而{quicksort(S2)}。
2、代碼
/*+++++++++++++++++++++++++++++++++++++
+ 快速排序(C版)
+
+author:zhouyongxyz 2013-4-15 9:39
+++++++++++++++++++++++++++++++++++++*/
#include <cstdio>
#define N 8
typedef int ElementType;
void Swap(ElementType &a,ElementType &b);
ElementType Median3(ElementType a[],int left,int right);
void QSort(ElementType a[],int left,int right);
void QuickSort(ElementType a[],int n);
int main()
{
int a[N]={4,3,5,2,9,7,6,8};
QuickSort(a,N);
for(int i=0;i<N;i++)
printf("%d ",a[i]);
printf("\n");
return 0;
}
void QuickSort(ElementType a[],int n)
{
QSort(a,0,n-1);
}
ElementType Median3(ElementType a[],int left,int right)
{
int center=(left+right)/2;
if(a[left]>a[center])
Swap(a[left],a[center]);
if(a[left]>a[right])
Swap(a[left],a[right]);
if(a[center]>a[right])
Swap(a[center],a[right]);
Swap(a[center],a[right-1]);
return a[right-1];
}
void Swap(ElementType &a,ElementType &b)
{
int tmp;
tmp=a;
a=b;
b=tmp;
}
void QSort(ElementType a[],int left,int right)
{
int i,j;
ElementType pivot;
if(left<right)
{
pivot=Median3(a,left,right);
i=left;
j=right-1;
while(1)
{
while(a[i]<pivot) i++;
while(a[j]>pivot) j--;
if(i<j)
Swap(a[i],a[j]);
else
break;
}
QSort(a,left,i-1);
QSort(a,i+1,right);
}
}