#include <iostream>
#include <vector>
#include <stack>
using namespace std;
int quickSortRecusive(vector<int>& data,int i,int j)
{
int l = i;
int r = j;
int x = data[r]; //基准
if(l >= r)
return l;
while(l < r){
while(l < r && data[l] < x){
l++;
}
if(l < r){
data[r] = data[l];
r--;
}
while(l < r && data[r] > x){
r--;
}
if(l < r){
data[l] = data[r];
l++;
}
}
data[l] = x;
quickSortRecusive(data,i,l-1);
quickSortRecusive(data,l+1,j);
}
int partition(vector<int>& data,int l,int r)
{
int x = data[r]; //基准
if(l >= r)
return l;
while(l < r){
while(l < r && data[l] < x){
l++;
}
if(l < r){
data[r] = data[l];
r--;
}
while(l < r && data[r] > x){
r--;
}
if(l < r){
data[l] = data[r];
l++;
}
}
data[l] = x;
return l;
}
void print(vector<int>& data)
{
for(auto &c : data)
cout << c << " ";
cout << endl;
}
//非递归实现
int quickSortNorecusive(vector<int>& data,int l,int r)
{
stack<int> st;
if(l < r)
{
int tmp = partition(data,l,r);
if(tmp-1 > l) //左边不止一个元素
{
st.push(tmp-1);
st.push(l);
}
if(tmp+1 < r)
{
st.push(r);
st.push(tmp+1);
}
while(!st.empty()){
int start = st.top();
st.pop();
int end = st.top();
st.pop();
int tmp = partition(data,start,end);
if(tmp-1 > start) //左边不止一个元素
{
st.push(tmp-1);
st.push(start);
}
if(tmp+1 < end)
{
st.push(end);
st.push(tmp+1);
}
}
}
}
int main(void)
{
vector<int> data={1,7,5,333,1,35,1245,2,68,32};
//quickSortRecusive(data,0,data.size()-1);
quickSortNorecusive(data,0,data.size()-1);
print(data);
}