非递归快排

#include <iostream>
#include <vector>
#include <stack>
using namespace std;
void quick_sort(vector<int> &v){
    int left = 0, right = v.size() - 1;
    stack<pair<int, int> >s;
    s.push(make_pair(left, right));
    while (!s.empty()){
        pair<int, int> t = s.top();
        s.pop();
        int left = t.first;
        int right = t.second;
        if (right <= left){
            continue;
        }
        int i = left, j = right;
        int target = v[left];
        while (i < j){
            while (i < j && v[j] >= target){
                j--;
            }
            while (i < j && v[i] <= target){
                i++;
            }
            if (i != j){
                swap(v[i], v[j]);
            }
        }
        v[left] = v[i];
        v[i] = target;
        if (left <= i - 1){
            s.push(make_pair(left, i - 1));
        }
        if (i + 1 <= right){
            s.push(make_pair(i + 1, right));
        }
    }
}
int main(){
    int n, t;
    vector<int> v;
    cin >> n;
    for (int i = 0; i < n; i++){
        cin >> t;
        v.push_back(t);
    }
    quick_sort(v);
    for (int i = 0; i < v.size(); i++){
        cout << v[i] << " ";
    }
}

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 非递归快排 Description 快速排序的核心思想是使用元素的值对数组进行划分。实现其非递归方案。 Input...
    Vmmmg阅读 3,505评论 0 0
  • 快排 快排的思想: 典型的分治,将数组分成两个子数组,并且分别对子数组排序,且子数组的排序也是分治。 快排和归并排...
    以梦为马驾驾驾阅读 3,126评论 0 2
  • 面试问到了,很尴尬,之前完全没想过的,而且有面试官视频远程从摄像头看着自己,又监控自己屏幕代码的情况下,真的大脑完...
    名字是乱打的阅读 1,625评论 0 1
  • 基本思想:(分治) 先从数列中取出一个数作为key值;将比这个数小的数全部放在它的左边,大于或等于它的数全部放在它...
    北国雪WRG阅读 5,169评论 0 2
  • 尾递归是个什么东西这边就不介绍了。总之递归我是一直没有搞明白。但是我知道尾递归是为了解决递归造成的栈溢出和大量重复...
    SmailEvery阅读 1,670评论 0 0