排序算法 --- 快速排序

1. 原理

首先, 在一个待排序序列中, 以第一个元素为基准, 让序列中所有的基准小的元素在该元素左边, 比其大的元素在其右边. 算法是一种原地算法, 首先把序列里面从基准开始的下一个元素一直到序列尾, 分成左右部分, 左边的都是小的, 右边的都是大的, 最后把基准跟中点交换一下, 再递归对左右部分进行同样的方法排序, 直到所有有序. 那么怎么实现基准后的元素左小右大呢, 可以用双指针的方法.

2. 算法实现

2.1 递归实现

void quikSort(vector<int>& nums, int start, int end) {
    if (start >= end)
        return;
    int mark = nums[start];
    int left = start + 1;
    int right = end;
    while (left < right) {
        if (nums[left] <= mark) {
            left ++;
            continue;
        }
        if (nums[right] >= mark) {
            right --;
            continue;
        }
        swap(nums[left], nums[right]);
    }
    if (nums[left] > mark)
        left --;
    swap(nums[start], nums[left]);
    quikSort(nums, start, left - 1);
    quikSort(nums, left + 1, end);
}
vector<int> sortArray(vector<int>& nums) {
    int n = nums.size();
    quikSort(nums, 0, n - 1);
    return nums;
}

2.2 迭代实现

vector<int> sortArray(vector<int>& nums) {
    int n = nums.size();
    if (n < 2)
        return nums;
    queue<pair<int, int>> sort_q;
    sort_q.push(make_pair(0, n - 1));
    while (!sort_q.empty()) {
        int start = sort_q.front().first;
        int end = sort_q.front().second;
        sort_q.pop();
        int left = start + 1;
        int right = end;
        while (left < right) {
            if (nums[left] < nums[start])
                left ++;
            else if (nums[right] > nums[start])
                right --;
            else {
                swap(nums[left], nums[right]);
            }
        }
        if (nums[left] > nums[start])
            left --;
        swap(nums[start], nums[left]);
        if (left - 1 > start)
            sort_q.push(make_pair(start, left - 1));
        if (left + 1 < end)
            sort_q.push(make_pair(left + 1, end));
    }
    return nums;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值