//分治的典型应用————快速排序
/*
数组排序任务可以如下完成:
1)设k=a[0], 将k挪到适当位置,
使得比k小的元素都在k左边,
比k大的元素都在k右边,
和k相等的,不关心 在k左右出现均可 (O(n)时间完成)
2) 把k左边的部分快速排序
3) 把k右边的部分快速排序
*/
//swap()函数包含在命名空间std里面,不用担心数据溢出问题
#include <iostream>
using namespace std;
void QuickSort(int a[],int s,int e) //快速排序
{
if( s >= e) //先来一个容错判断
return;
int k = a[s]; //就从第一个元素开始,以第一个元素为判断参照
int i = s,j = e; //确定好左右指针
while( i != j ) //大条件
{
while( j > i && a[j] >= k ) //后面的元素比 k 大:符合情况
--j;
swap(a[i],a[j]); //正是因为找到了后面的元素比 K 小了,所以要进行置换
while( i < j && a[i] <= k ) //前面的元素比 k 小:符合情况
++i;
swap(a[i],a[j]); //正是因为找到了前面的元素比 k 大了,所以要进行置换
} //处理完后,a[i] = k
QuickSort(a,s,i-1); //对前半部分进行快派
QuickSort(a,i+1,e); //对后半部分进行快派
}
int a[100000];//待排函数
int main()
{
int n;
cin >> n;
for(int i = 0; i<n ;i++)
{
cin >> a[i];
}
//int size = sizeof(a)/sizeof(int); //获取数组内元素的个数
QuickSort(a,0,n-1); //对数组进行快速排序
for(int i = 0;i < n; ++i) //输出
cout << a[i] << ",";
cout << endl;
return 0;
}