zoukankan      html  css  js  c++  java
  • 快排的各种写法:递归/非递归 + 双指针/挖坑法

    #include <iostream>
    #include <vector>
    #include <stack>
    using namespace std;
    
    //双指针法
    int part2(vector<int>& arr, int l, int r){
        int pivot = arr[l];
        int i = l, j = r; 
        while(i < j){   //循环不变式必须 为i < j,因为设为 i<= j 时,会越界
            while(i < j && arr[j] >= pivot) j--;  // 设为 i<= j 时,例 [2, 6, 5, 7, 4] 会出数组边界最后 j = -1
            while(i < j && arr[i] <= pivot) i++;
            swap(arr[i], arr[j]);
        }
        swap(arr[i], arr[l]);
        return i;
    }
    //挖坑法
    int part(vector<int>& arr, int l, int r){
        int pivot = arr[l];
        while(l < r){
            while(l < r && arr[r] >= pivot) r--;
            arr[l] = arr[r];
            while(l < r && arr[l] <= pivot) l++;
            arr[r] = arr[l];
        }
        arr[l] = pivot;
        return l;
    }
    //非递归法--栈模拟递归,栈中存的是递归调用中的[l, pivot-1], [pivot+1, r]
    void quickSort2(vector<int>& arr, int l, int r){
        stack<int> S;  
        S.push(l);
        S.push(r);
        while(!S.empty()){
            int en = S.top();
            S.pop();
            int beg = S.top();
            S.pop();
            int pivot = part(arr, beg, en);
            if(beg < pivot-1){  //等于递归方法中的边界判断,要使 l < r 才执行part(arr, l, r);
                S.push(beg);
                S.push(pivot-1);
            }
            if(en > pivot+1){
                S.push(pivot+1);
                S.push(en);
            }
        }
    }
    //递归法
    void quickSort(vector<int>& arr, int l, int r){
        if(l >= r) return;
        int p = part2(arr, l, r);
        quickSort(arr, l, p-1);
        quickSort(arr, p+1, r);
    }
    
    int main(){
        int n;
        vector<int> arr(n);
        cout << "array size: " << endl;
        cin >> n;
        cout << "array: " << endl;
        for(int i = 0; i < n; i++){
            cin >> arr[i];
        }
        quickSort2(arr, 0, n-1);
        for(int i = 0; i < n; i++){
            cout << arr[i] << " ";
        }
        cout << endl;
    }
  • 相关阅读:
    「数列分块入门学习笔记」
    「Luogu P3273 [SCOI2011]棘手的操作」
    「CF1342D Multiple Testcases」
    「CF803G Periodic RMQ Problem」
    【cf比赛记录】Educational Codeforces Round 77 (Rated for Div. 2)
    【cf比赛记录】Codeforces Round #601 (Div. 2)
    【cf比赛记录】Codeforces Round #600 (Div. 2)
    【学习报告】简单搜索
    【POJ2676】Sudoku
    【POJ1416】Shredding Company
  • 原文地址:https://www.cnblogs.com/tristatl/p/13095659.html
Copyright © 2011-2022 走看看