快排是目前最快的排序方法(我知道的)。之前就学过,但没怎么总结,这里写一个总结。
自我感觉快排利用了类似二分的方法,把一个大区间先解决整体的排序,细节的排序先不管,然后把这个大区间分为2个小区间,用同样的方法解决这个区间的大问题,再分小区间来解决小问题。
举个例子模拟一下过程吧。
5 9 6 4 8
首先把这5个数存起来,存入数组,看成一个区间,左边界下标为1,右边界下标为5,然后以第一个数作为这个区间的基始点5,先从右到左找到一个小于这个基始点的数(从左边找的下标要小于从右找的坐标,即i
void qsort(int l,int r)
{
int i,j,t,temp;
if(l>=r)
return;
i=l;
j=r;
temp=a[l];
while(i!=j)
{
while(a[j]>=temp&&i<j)
j--;
while(a[i]<=temp&&i<j)
i++;
// printf("i=%d b[i]=%d j=%d b[j]=%d\n",i,a[i],j,a[j]);
if(i<j)
{
t=a[i];
a[i]=a[j];
a[j]=t;
}
for(int i=0;i<n;i++)
{
printf("%d ",a[i]);
}
printf("\n");
}
// printf("i=%d l=%d b[i]=%d b[l]=%d\n\n",i,l,a[i],a[l]);
a[l]=a[i];
a[i]=temp;
qsort(l,i-1);
qsort(i+1,r);
}
算法不算难,多模拟几次就好了,