#include<iostream>
#include<vector>
#include<set>
#include<algorithm>
#include<stack>
using namespace std;
//快排非递归
int Pritation(vector<int>& vec, int left, int right)
{
if (vec.size()==0 || left < 0 || right <= 0 || left >= right)
return -1;
int priot = vec[left];
int i = left, j = right;
while (i < j)
{
while (i < j&&vec[j] >= priot)
j--;
if (i<j)
vec[i] = vec[j];
while (i < j&&vec[i] <= priot)
i++;
if (i<j)
vec[j] = vec[i];
}
vec[i] = priot;
return i;
}
void QuickSort(vector<int>& vec, int left, int right)
{
if (vec.size()== 0|| left < 0 || right <= 0 || left>right)
return;
stack<int>temp;
int i, j;
//(注意保存顺序)先将初始状态的左右指针压栈
temp.push(right);//先存右指针
temp.push(left);//再存左指针
while (!temp.empty())
{
i = temp.top();//先弹出左指针
temp.pop();
j = temp.top();//再弹出右指针
temp.pop();
if (i < j)
{
int k = Pritation(vec, i, j);
if (k > i)
{
temp.push(k - 1);//保存中间变量
temp.push(i); //保存中间变量
}
if (j > k)
{
temp.push(j);
temp.push(k + 1);
}
}
}
}
//冒泡选择 插入 快排(非递归递归) 归并(递归非递归) 堆排序
void Heapify(vector<int>& vec,int len,int i){ //调整堆
if (i >= len){
return;
}
int leftpoint = 2 * i + 1;
int rightpoint = 2 * i + 2;
int max = i;
if (leftpoint<len&&vec[leftpoint] > vec[max]){
max = leftpoint;
}
if (rightpoint<len&&vec[rightpoint] > vec[max]){
max = rightpoint;
}
if (max != i){
swap(vec[max],vec[i]);
Heapify(vec, len, max);
}
}
void BuildHeap(vector<int>& vec){ //创建堆
int len = vec.size()-1;
int index = (len - 1) / 2;
for (int i = index; i >= 0; i--){
Heapify(vec,vec.size(),i);
}
}
void HeapSort(vector<int>& vec){
BuildHeap(vec);
for (int i = vec.size()-1; i >= 0; i--){
swap(vec[i], vec[0]);
Heapify(vec,i,0);
}
}
int main(){
/*任一节点的父节点是(i-1)/2
子节点是2*i+1和 2*i+2
*/
vector<int> vec = {20,12,5,6,7,65,100};
QuickSort(vec,0,vec.size()-1);
for (int i = 0; i < vec.size(); i++){
cout << vec[i] << " ";
}
cout << endl;
return 0;
}