//只是随手写写,非递归版的快排
#include <iostream>
#include <stack>
using namespace std;
using std::stack;
struct Node
{
int begin, end;
};
int partition(int *a, int begin, int end)
{
int p = a[end];
int pos = begin;
for(int i = begin; i < end; i++)
{
if(a[i] <= p)
{
swap(a[i], a[pos]);
pos++;
}
}
swap(a[end], a[pos]);
return pos;
}
void quick_sort(int *a, int begin, int end)
{
if(end <= begin)
return;
int pivot = partition(a, begin, end);
quick_sort(a, begin, pivot - 1);
quick_sort(a, pivot + 1, end);
}
void quick_sort_not_recursive(int *a, int begin, int end)
{
stack<Node> pos;
Node node;
int pivot;
node.begin = begin;
node.end = end;
pos.push(node);
while(!pos.empty())
{
Node tmp_node = pos.top();
pos.pop();
pivot = partition(a, tmp_node.begin, tmp_node.end);
if(pivot -1 > tmp_node.begin)
{
node.begin = tmp_node.begin;
node.end = pivot - 1;
pos.push(node);
}
if(pivot + 1 < tmp_node.end)
{
node.begin = pivot + 1;
node.end = tmp_node.end;
pos.push(node);
}
}
}
int main()
{
int a[] = {1, 2, 3, 5, 10, 4, 6, 7, 7, 2};
//int a[] = {1, 2, 7, 7, 2};
int len = sizeof(a) / sizeof(a[0]);
//quick_sort(a, 0, len - 1);
for(int i = 0; i < len; i++)
{
cout << a[i] << " ";
}
cout << endl;
quick_sort_not_recursive(a, 0, len - 1);
for(int i = 0; i < len; i++)
{
cout << a[i] << " ";
}
cout << endl;
return 0;
}