#include <stdio.h>
#include <stdlib.h>
/*
快速排序算法,最坏情况的运行时间为O(n*n),平均运行时间为O(n*lgn)
*/
void exchage(int *a,int i,int j)//交换数组两个数的位置
{
int temp;
temp=a[i];
a[i]=a[j];
a[j]=temp;
}
int partition(int *a,int p,int r)//对数组a[p...r]进行就地重排,返回大小为中间的元素位置。
{
int i,j,x;
x=a[r];//记录当前数组最后一个位置,作为分界的主元元素
i=p-1;//i用来记录当前的第一个比主元大的元素位置
j=p;
for(j=p;j<r;j++)
{
if(a[j]<=x)//每当有元素比主元小时,将该元素与最前面的大元素换位置,并移动指示i
{
i++;
exchage(a,i,j);//交换a[i]与a[j]
}
}
exchage(a,i+1,r);//遍历结束后,将主元与最前面的大元素交换位置,保证交换后,左边都小,右边都大
return i+1;//返回分割的位置
}
void quicksort(int *a,int p,int r)//递归进行快速排序
{
int q;
if(p<r)
{
q=partition(a,p,r);//产生q的时候,a[q]已经位于正确的位置,再递归排序两边的元素
quicksort(a,p,q-1);
quicksort(a,q+1,r);
}
}
int main(int argc, char *argv[])
{
int a[1000]={0};
int i,n;
printf("输入要排序的数量\n");
scanf("%d",&n);
printf("输入n个要排序的数\n");
for(i=1;i<=n;i++)
scanf("%d",&a[i]);
quicksort(a,1,n);
printf("快速排序后\n");
for(i=1;i<=n;i++)
printf("%d ",a[i]);
system("PAUSE");
return 0;
}