算法导论快速排序实现
快速排序通常是实际排序应用中最好的选择
#include <stdio.h>
#include <stdlib.h>
int partion(int a[],int p,int r)
{
int x=a[r-1];
int i=p-1;
int j=0,temp=0;
for(j=p;j<r-1;++j)
{
if(a[j]<=x)
{
i++;
temp=a[i];
a[i]=a[j];
a[j]=temp;
}
}
temp=a[i+1];
a[i+1]=a[r-1];
a[r-1]=temp;
return i+1;
}
void quicksort(int a[],int p,int r)
{
int q=0;
if(p<r)
{
q=partion(a,p,r);
quicksort(a,p,q-1);
quicksort(a,q+1,r);
}
}
int main()
{
int a[]={1,4,1,5,9,34,45,2,6,0};
quicksort(a,0,sizeof(a)/sizeof(int));
int i=0;
for(i=0;i<sizeof(a)/sizeof(int);++i)
printf("%d ",a[i]);
return 0;
}
快速排序的随机化版本
在输入元素互异的情况,快速排序的期望运行时间为 0(nlgn)
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int partion(int a[],int p,int r)
{
int x=a[r-1];
int i=p-1;
int j=0,temp=0;
for(j=p;j<r-1;++j)
{
if(a[j]<=x)
{
i++;
temp=a[i];
a[i]=a[j];
a[j]=temp;
}
}
temp=a[i+1];
a[i+1]=a[r-1];
a[r-1]=temp;
return i+1;
}
int randompartion(int a[],int p,int r)
{
srand((unsigned)time(0));
int i=rand()%(r-p)+p;
if(i!=p)
{
int temp=a[i];
a[i]=a[r-1];
a[r-1]=temp;
}
return partion(a,p,r);
}
void quicksort(int a[],int p,int r)
{
int q=0;
if(p<r)
{
q=randompartion(a,p,r);
quicksort(a,p,q);
quicksort(a,q+1,r);
}
}
int main()
{
int a[]={1,4,1,5,9,34,45,2,6,0};
quicksort(a,0,sizeof(a)/sizeof(int));
int i=0;
for(i=0;i<sizeof(a)/sizeof(int);++i)
printf("%d ",a[i]);
return 0;
}