介绍
快速排序是速度非常快的排序,虽然其最糟糕(已经排好序)的时间为O(n^2),但是平均时间可以达到O(nlgn),平均性能比堆排序优越!是原地排序算法。基于分治法思想。
思想:
A[left..right]被分成2个(可能空)子数组A[left..center-1]和A[center+1..right]。使得前子数组每个元素都<= A[center],
而后子数组的元素全>=A[center]。
通过递归调用快速排序。对2个子数组进行排序。
![](https://img-blog.csdn.net/20130518205901013)
下面是QuickSort.c源码。通过linux的gcc和windows的VS2010编译测试。
#include<stdio.h>
void exchange(int *a,int *b)
{
int tmp = *b;
*b = *a;
*a = tmp;
}
int QPartition(int A[], int left ,int right)
{
int key = A[right];
int leftindex = left-1;
int cur = left;
for(cur;cur < right; cur++)
{
if(A[cur] <= key)
{
leftindex +=1;
exchange(&A[leftindex],&A[cur]);
}
}
exchange(&A[leftindex+1] ,&A[right]);
return leftindex+1;
}
void QuickSort(int a[],int left,int right)
{
if(left<right)
{
int center = QPartition(a,left,right);
QuickSort(a,left,center-1);
QuickSort(a,center+1,right);
}
}
void printArr(int *p, int size)
{
int i;
for(i=0; i<size;i++)
{
printf("%d ",p[i]);
}
putchar('\n');
}
int main()
{
int b[10]={-3,1,34,5,-1,3,43,5,123,3};
printArr(b,10);
QuickSort(b,0,9);
printArr(b,10);
return 0;
}
结果是:
-3 1 34 5 -1 3 43 5 123 3
-3 -1 1 3 3 5 5 34 43 123