排序算法十分常用,快速排序效率较高而理解复杂,今天就来谈谈它。
百度百科的解释较为饶人,贴出如下:
快速排序由C. A. R. Hoare在1962年提出。它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。
通俗的话来说:
1.选择一个基准数;
2.通过数组内赋值,使得基准数填在准确的位置,同时其左边比它小,右边比它大;
3.对第二步中的准确值左右分区重复1-2。
举个例子:
a[5]={4,5,3,8,1}
1.选择基准数为int base = 4, i = 0 ,j = 4 ;//萝卜被拔出
a[5]={4,5,3,8,1}
2.从右至左寻找是否有比base更适合a[0]这个“小号坑”,发现j=4时适合,即填入,此时
a[5]={1,5,3,8,1}
3.从左至右寻找是否有比base更适合a[4]这个“大号坑”,发现i=2时适合,即填入,此时
a[5]={1,5,3,8,5}
4.从右至左寻找是否有比base更适合a[1]这个“小号坑”,发现j=2时适合,即填入,此时
a[5]={1,3,3,8,5}
5.没人比基准更适合这个坑了,填入,判定条件“i = = j”,此时
a[5]={1,3,4,8,5}
以上完成一轮,左右再分区递归即可。
void quick_sort(int s[],int l,int r)
{
if (l < r)
{
int i=l,j=r, base=s[l];//拔出萝卜留下坑
while(i<j) //
{
while(i<j&&s[j]>= base) // 从右向左找第一个小于x的数
j--;
if(i<j)
s[i++]=s[j]; //拔出,填坑
while(i<j&&s[i]< base) // 从左向右找第一个大于等于x的数
i++;
if(i<j)
s[j--]=s[i]; //拔出,填坑
}
s[i]= base; //base填入正确位置
quick_sort(s,l,i-1); // 递归调用
quick_sort(s,i+1,r);
}
}