//任意选取一个记录作为枢轴,然后将所有关键字小于它的记录都放置在它之前,关键字大于它的记录都放置在它之后,以该枢轴为分界线,将整个序列划分为两个子序列,完成一趟快速排序,然后对两个子序列进行同样的操作,直到子序列不可再分
//平均时间复杂度为o(nlog2n) ,k为常数,在所有排序方法中,快排平均性能最好,但当记录序列基本有序时,快排将退化为冒泡排序
//快排时递归的。,需要一个栈存放每层递归调用时的指针和参数,最大递归调用层数与递归树的深度一致理想情况为[log2(n+1)],因此快排的存储开销为O(log2n)
#include <iostream>
#include<vector>using namespace std;
void quicksort(vector<int> &data,int l,int r)
{
if(l>=r)
return ;
int i=l,j=r;
int temp=data[i];
while(i!=j)
{
//从后往前找第一个小于temp的值
while(data[j]>=temp&&i<j)
j--;
if(i<j)
{
data[i++]=data[j];
}
//从前往后找第一个大于temp的值
while(data[i]<=temp&&i<j)
i++;
if(i<j)
data[j--]=data[i];
}
data[i]=temp;
quicksort(data,l,i-1);
quicksort(data,i+1,r);
}
int main()
{
vector<int> data;
int a;
while(cin>>a)
{
data.push_back(a);
}
int len=data.size();
quicksort(data,0,len);
for(auto a:data)
cout<<a<<endl;
return 0;
}