【排序算法】快排

递归实现:

#include <iostream>
#include <stdio.h>
#include <vector>
#include <algorithm>
using namespace std;

int partition_(vector<int>& v, int left, int right) {
    int st = left;
    int ed = right;
    int key = v[st];
    while(st < ed) {
        while(st < ed && v[ed] > key) {
            ed--;
        }
        if (st < ed) v[st++] = v[ed];

        while(st < ed && v[st] < key) {
            st++;
        }
        if (st < ed) v[ed--] = v[st];
    }
    v[st] = key;
    return st;
}

void quickSort(vector<int>& v, int left, int right) {
    if (left < right) {
        int p = partition_(v, left, right);
        quickSort(v, left, p-1);
        quickSort(v, p+1, right);
    }
}

int main() {
    int n;
    while(cin >> n) {
        vector<int> nums;
        for (int i=0; i<n; ++i) {
            int tmp;
            cin >> tmp;
            nums.push_back(tmp);
        }
        quickSort(nums, 0, n-1);
        for (int i=0; i<n; ++i) {
            cout << nums[i] << " ";
        }
        cout << endl;
    }
    return 0;
}

非递归实现:

#include <iostream>
#include <stdio.h>
#include <vector>
#include <algorithm>
#include <stack>
using namespace std;

int partition_(vector<int>& v, int left, int right) {
    int st = left;
    int ed = right;
    int key = v[st];
    while(st < ed) {
        while(st < ed && v[ed] > key) {
            ed--;
        }
        if (st < ed) v[st++] = v[ed];

        while(st < ed && v[st] < key) {
            st++;
        }
        if (st < ed) v[ed--] = v[st];
    }
    v[st] = key;
    return st;
}

void quickSort(vector<int>& v, int left, int right) {
    if (left >= right) return;
    stack<pair<int, int> > s;
    s.push({left, right});
    while(!s.empty()) {
        left = s.top().first;
        right = s.top().second;
        s.pop();
        if (left < right) {
            int p = partition_(v, left, right);
            s.push({left, p-1});
            s.push({p+1, right});
        }
    }
}

int main() {
    int n;
    while(cin >> n) {
        vector<int> nums;
        for (int i=0; i<n; ++i) {
            int tmp;
            cin >> tmp;
            nums.push_back(tmp);
        }
        quickSort(nums, 0, n-1);
        for (int i=0; i<n; ++i) {
            cout << nums[i] << " ";
        }
        cout << endl;
    }
    return 0;
}

发布了323 篇原创文章 · 获赞 10 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/iCode_girl/article/details/105376854