十大基础实用算法补全——快速排序(QuickSort)

   快速排序是排序算法中效率相对较高的,但使用的人却是比较少。大家一般信手拈来的排序算法就是冒泡排序,因为冒泡排序主观,容易理解。而快速排序使用到了递归,大家可能就有点不知所措了。(以上5毛)

算法简介

  快速排序由C. A. R. Hoare在1962年提出。

基本思想:

  1. 通过一趟排序将要排序的数据列分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小;

  2. 然后再按此方法对这两部分子数据列分别1操作,直到子数据的大小为0或1。

快速排序示例

算法步骤:

  1. 设置left、right变量用于记录移动下标;
  2. 从数列中挑出一个元素,记称为 value,一般选择array[start]或array[end](此处我们选取array[start]);
  3. 从right开始向前搜索(right--),找到第一个小于value的值array[right],将array[right]赋给array[left] (此处array[left]已被记录,故不用担心被覆盖);
  4. 从left开始向后搜索(left++),找到第一个大于value的值array[left],将array[left]赋给array[right](同理:此处array [right] 已被记录,故不用担心被覆盖);
  5. 重复3、4步,直到 left==right;
  6. 递归以上步骤完成对整个数列排序。

代码实现

本例为升序排列,且用较为简单的数据来演示

#include <stdio.h>

void printArray(int *array, int length)
{
    printf("array:\n");
    for (int index = 0; index < length; index++)
    {
        printf(" %d", *(array + index));
    }
    printf("\n\n");
}

void quickSort(int array[], int start, int end)
{
    if (start >= end)   //数列size为0或1
    {
        //递归出口
        return;
    }

    //因为需要对元素进行移动,需复制一份左右下标用于移动
    int left = start;
    int right = end;

    int value = array[start];   //选取数列第一个元素为基准

    while (left < right)
    {
        while (left < right && value <= array[right])//从后选取第一个小于基准的元素
        {
            right--;
        }
        array[left] = array[right];//换位。此处会产生自己赋值自己情况,可加判断取消
        /*printf("后向前移");
        printArray(array, 4);*/

        while (left < right && value >= array[left])//从前选择第一个大于基准的元素
        {
            left++;
        }
        array[right] = array[left];//换位
        /*printf("前向后移");
        printArray(array, 4);*/
    }
    array[left] = value;
    /*printf("一次完成");
    printArray(array, 4);*/

    //递归
    quickSort(array, start, left - 1);
    quickSort(array, left + 1, end);
}

int main()
{
    int array[4] = { 2,3,1,4 };
    printArray(array, 4);
    quickSort(array, 0, 3);
    printArray(array, 4);
    return 0;
}

运行结果:
快排运行结果


复杂度分析

  关于快速排序的时间复杂度和空间复杂度,大家可以参考:排序算法之 快速排序 及其时间复杂度和空间复杂度   


  刚玩博客,如果有什么错误之处或建议,请在评论区告诉我,谢谢!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值