快速排序的递归和迭代两种实现,简单易懂

快速排序法的递归和迭代两种实现。迭代实现基本复用了递归实现的代码,在递归基础上小小的改动即可。

递归版

#include <bits/stdc++.h>
using namespace std;

/*
快速排序递归法与迭代法实现
*/
void quick_sort_recursive(vector<int> &arr, int start, int end)
{
    // 这里采用闭区间,下文迭代法也统一使用闭区间
    if (start >= end)
        return;
    int base = arr[start];
    int left = start, right = end;
    while (left < right)
    { // while结束条件
        while (left < right && arr[right] >= base)
        {
            right--; // 从右往左找到第一个比base小的数
        }
        while (left < right && arr[left] <= base)
        {
            left++; // 从左往右找到第一个比base大的数
        }
        swap(arr[left], arr[right]); // 交换
    }
    swap(arr[start], arr[left]); // 最后left==right,该位置的数一定是小于等于base的数
    quick_sort_recursive(arr, start, left - 1);
    quick_sort_recursive(arr, left + 1, end);
}

迭代版

struct param
{
    int low;
    int high;
    param(int l, int h) : low(l), high(h){};
};

void quick_sort_iterative(vector<int> &arr)
{
    /*
    快速排序本质上是二叉树的前序遍历,可以使用栈来模拟

    */
    stack<param> stk;
    int end = arr.size() - 1;
    stk.emplace(0, end);
    while (!stk.empty())
    {
        param cur = stk.top();
        stk.pop();
        // 下面就是直接复制递归的实现了
        int start = cur.low;
        int end = cur.high;
        if (start >= end)
            continue;
        int base = arr[start];
        int left = start, right = end;
        while (left < right)
        { // while结束条件
            while (left < right && arr[right] >= base)
            {
                right--; // 从右往左找到第一个比base小的数
            }
            while (left < right && arr[left] <= base)
            {
                left++; // 从左往右找到第一个比base大的数
            }
            swap(arr[left], arr[right]); // 交换
        }
        swap(arr[start], arr[left]); // 最后left==right,该位置的数一定是小于等于base的数
		// 模拟递归
        stk.emplace(left+1,end);
        stk.emplace(start,left-1);
    }
}
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值