#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 i;
}
//非递归法--栈模拟递归,栈中存的是递归调用中的[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;
}