1 #include<iostream>
2 #include<stdio.h>
3 #include<algorithm>
4
5 using namespace std;
6
7 int partition(int *a,int left,int right)
8 {
9 a[0] = a[left]; //设置a[left]为主键值,存于a[0],即以a[left]值将[left,right]区间一分为二
10 while(left<right)
11 {
12 while(left<right&&a[right]>=a[0]) right--; //从右边开始找到比主键值a[0]小的值,移到左边
13 a[left]=a[right];
14 while(left<right&&a[left]<=a[0]) left++; //从左边开始找到比主键值a[0]大的值,移到右边
15 a[right]=a[left];
16 }
17 a[left] = a[0]; //跳出while循环后的left==right,此时,区间已经一分为二了,将a[left]的值还原
18 return left;
19 }
20
21 void QuickSort(int *a,int left,int right)
22 {
23 if(left<right) //快拍区间要大于1
24 {
25 int mid = partition(a,left,right); //进行一次划分,以a[left]划分区间为左右两个区间
26 QuickSort(a,left,mid-1); //对左区间进行进一步划分
27 QuickSort(a,mid+1,right); //对左区间进行进一步划分
28 }
29 }
30
31 int main()
32 {
33 int n;
34 int a[10000];
35 while(~scanf("%d",&n))
36 {
37 int i;
38 for(i=1;i<=n;i++)
39 {
40 scanf("%d",a+i);
41 }
42 QuickSort(a,1,n);
43 for(i=1;i<=n;i++)
44 {
45 printf("%d ",a[i]);
46 }
47 putchar(10);
48 }
49 return 0;
50 }