快排还是比堆排序的调用简单些,很快敲定了
《算导》正文里面的快排 Partition 程序是由 N.Lomuto 提出的,与我们教科书上面的 Partition 不同,教科书上面的程序是由 Hoare 提出的,Hoare 是快排的发明者,很厉害的人!!
这两种算法并没有本质上的差别,但是前者的思路更清晰
#include <iostream>
//引用地址空间
void exchange(int &a,int &b)
{
int tmp=a;
a=b;
b=tmp;
}
//将表一分为二
int Partition(int A[],int p,int r)
{
int x=A[r];
int i=p-1;
int j;
//如书上所说,将 A[p..r] 分成三个部分
for(j=p;j<=r-1;j++)
if(A[j]<=x)
{
i++;
exchange(A[i],A[j]);
}
exchange(A[i+1],A[r]);
return i+1;
}
void Quicksort(int A[],int p,int r)
{
int q;
if(p<r)
{
q=Partition(A,p,r);
Quicksort(A,p,q-1);
Quicksort(A,q+1,r);
}
}
int main()
{
int A[6]={0,5,3,2,1,4};
Quicksort(A,1,5);
for(int i=1;i<=5;i++)
printf("%d ",A[i]);
return 0;
}
运行结果为:
1 2 3 4 5