快速排序

直接上代码,如下:

#include 
#include 

using namespace::std;

void QSort(vector<int> &a, int left, int right) {
    int k = left;
    int start = left;
    int end = right;
    if (end < start || end >= a.size() || start < 0) {
        return;
    }
    while (left <= right) {
        if (a[left] <= a[right]) {
            if (k == left)
                right--;
            else if (k == right)
                left++;
        }
        else {
            int temp = a[left];
            a[left] = a[right];
            a[right] = temp;
            if (k == left) {    
                k = right;
                left++;
            }
            else if (k == right) {
                k = left;
                right--;
            }
        }
    }
    QSort(a, start, k - 1);
    QSort(a, k + 1, end);
}

int main() {

    int n;
    while (cin >> n) {
        vector<int> a;
        for (int i = 0; i < n; i++) {
            int temp;
            cin >> temp;
            a.push_back(temp);
        }

        //cout << a.size() << endl;
        QSort(a, 0, n - 1);
        for (int i = 0; i < n; i++) {
            cout << a[i] << ' ';
        }
        cout << endl;
    }


    return 0;
}

总结

快速排序是递归和动态规划的综合使用,本质上是对冒泡排序的一种改进,不过快速排序是不稳定排序,而冒泡排序是稳定排序。
每一轮快速排序的核心在于三个指针 left, right 和 k。 顾名思义, left代表左边, right 代表右边,而 k 所指的元素就是用来划分当前数组的元素(小于 k 的放在左边, 大于 k 的放在右边)。而在编写代码的过程中, 要注意根据 k 等于 left 还是 right 来确定这一轮的下一步是 right++ 还是 left++。

你可能感兴趣的:(迭代器,排序)