排序算法之(5)--快速排序

介绍

快速排序(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);
}

猜你喜欢

转载自blog.csdn.net/hiudawn/article/details/80378007