重新教自己学算法之递归排序——快速排序(四)

快速排序作为最常用和最有效的排序算法之一,其递归和分治的思想也是值得好好借鉴的。
下面进行详细说明:
代码如下:

int _quick_sort(int array[], int start, int end)
{
    //进行排序后获得中间值
    int i = start, j = end;
    int temp_value = array[start];
    while(i < j)
    {
        while(i < j && array[j] >= temp_value)
            j--;
        if(i < j)
        {
            array[i] = array[j];
        }
        while(i < j && array[i] <= temp_value)
            i++;
        if(i < j)
        {
            array[j] = array[i];
        }

    }
    array[i] = temp_value;
    return i;
}
void quick_sort(int array[], int start, int end)
{
    if(NULL == array || start >= end)
        return ;
    // if(start >= end)return;
    int middle = _quick_sort(array, start, end);
    // cout<<middle<<endl;

    // if(middle != 0)
    quick_sort(array, start, middle -1);
    quick_sort(array, middle + 1, end);
}

快速排序是找出一个元素(理论上可以随便找一个)作为基准(pivot),然后对数组进行分区操作,使基准左边元素的值都不大于基准值,基准右边的元素值 都不小于基准值,如此作为基准的元素调整到排序后的正确位置。递归快速排序,将其他n-1个元素也调整到排序后的正确位置。最后每个元素都是在排序后的正 确位置,排序完成。所以快速排序算法的核心算法是分区操作,即如何调整基准的位置以及调整返回基准的最终位置以便分治递归。

对数组{5,3,6,2,1,9,3,4,8,0}进行排序:
一趟排序如下:
[0,3,6,2,1,9,3,4,8,,0] //从该序列最后一个数开始比较,0<5:将5位置的数赋值为0
[0,3,6,2,1,9,3,4,8,6] //有不满足条件的,赋值后改变比较顺序,从开始比较,0<5,继续;3<5,继续;6>5,将上一个数0位置的数赋值为6
[0,3,4,2,1,9,3,4,8,6] //重复上面步骤,从6位置处开始比较
[0,3,4,2,1,9,3,9,8,6] //从4位置处开始比较
[0,3,4,2,1,3,3,9,8,6] //当比较两数的下标相同时,插入中间值。
[0,3,4,2,1,3,5,9,8,6] //完成一趟排序。

下面分别对[034213], [986]进行相同方法递归排序,即可得到结果。
若不明白,可仔细看代码实现。
总结:1:验证参数的合法性
2:理解快排的思想步骤,知道在什么地方退出比较。

    原文作者:排序算法
    原文地址: https://blog.csdn.net/u012935756/article/details/45920347
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞