介绍
快速排序(Quick Sort)的基本思想是:通过一趟排序将待排记录分割成独立的两部分,其中一部分记录的关键字均比另一部分记录的关键字小,则可分别对这两部分记录继续进行排序,以达到整个序列有序的目的。
这个排序可谓是面试最喜欢问的了,用的是递归思想。看上去似乎很难理解,其实只要设定好递归出口,实现起来也并不太难。
这个动图好像有点难理解,我再找点资源看看。
感兴趣的参考这里,我只是写来有助于自己理解
http://www.cnblogs.com/cj723/archive/2011/04/27/2029993.html
代码
//辅助函数:交换两个变量
void swap(int*a,int*p)
{
int temp = *a;
*a = *p;
*p = temp;
}
//快速排序
//顾名思义,排得真的很快。用递归思想
//每次找一个基准数,以其为参考点,比它小的放左边,大的放右边(这两堆内部可能是无序的)
//再把分好的两堆各自找个基准数,按前面的步骤再来,直至数据不能再分,排序完毕
//基准先挖出来,有i,j两个指针,一开始j往左挪,如果遇到比基准小的,填到基准位置
//之后换i往后挪,遇到比基准大的,就放到j的那个坑。全部跑完后,基准丢到最后剩出来的那个坑。
void quickSort(int* arr,int start,int end)
{
//递归最重要的就是设置退出条件,如下
if(start>=end)
{
return;
}
int i = start;
int j = end;
int temp = arr[i];
//如果右指针j一直没小于左指针i,一直跑
while(i<j)
{
//先从右边找比基准小的,找到和基准交换,但要保留j值
while(i<j)
{
if(arr[j]<temp)
{
swap(&arr[j],&arr[i]);
break;
}
j--;
}
//右边找到一个比基准小的之后,轮到左边找比基准大的,然后和上面空出的j位置交换
while(i<j)
{
if(arr[i]>temp)
{
swap(&arr[j],&arr[i]);
break;
}
i++;
}
}
//排左半区
quickSort(arr,start,i-1);
//排右半区
quickSort(arr,i+1,end);
}