//这是快速排序的两种思想,两种代码思想
#include <stdio.h>
#include <stdlib.h>
int partition(int a[],int p,int r)
{
int i,j,key,tmp;
key=a[r];
i=p-1;
for(j=p;j<r;j++)
{
if(a[j]>key)
{
i=i+1;
tmp=a[i];
a[i]=a[j];
a[j]=tmp;
}
}
tmp=a[i+1];
a[i+1]=a[r];
a[r]=tmp;
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 partition2(int a[],int p,int r)
{
int i,j,x,tmp;
x=a[p];
i=p-1;
j=r+1;
while(1)
{
for(j=j-1;j>=p;j--)
if(a[j]<=x)
break;
for(i=i+1;i<=r;i++)
if(a[i]>=x)
break;
if(i<j)
{
tmp=a[i];
a[i]=a[j];
a[j]=tmp;
}
else
return j;
}
}
void quicksort2(int a[],int p,int r)
{
int q;
if(p>=r)
return ;
q=partition2(a,p,r);
quicksort2(a,p,q);
quicksort2(a,q+1,r);
}
int main()
{
int a[]={2,8,7,1,3,5,6,4};
int b[]={13,19,9,5,12,8,7,4,11,2,6,21};
int i;
//printf("partitiion2 is %d\r\n",partition2(b,0,11));
quicksort2(b,0,11);
for(i=0;i<12;i++)
printf("%d\r\n",b[i]);
return 0;
}
其中quicksort2是最原始的思想做法。
第一种:
关键的地方在于partition这个函数,这是一个去顶位置的函数,每次使用数组的最后一个元素最为主元(key=a[r])。使用这个主元将数组分为两部分,右边是比主元大的元素,左边是比主元小的元素。首先变量有i、j、p、r,i是记录左边最后一个比主元小的元素,初始值为p-1,j从数组开始位置P一直查找到数组倒数第二个元素r-1,如果其中某个元素a[j]<=key,先将i++,然后置换a[i]和a[j],等到循环结束,a[r]和a[i+1]置换,然后返回i+1。但是在递归调用的时候注意,a[q]是没有用的。
第二种:
这种思想就是在查找位置的时候从两头开始,左边开始找比第一个比主元大的元素,右边查找第一个比主元小的元素,如果左边的位置i比右边的位置J小,那么置换这两个值,否则返回j。在递归的时候,不能忽略查找的位置关键字。