#include <iostream>
using namespace std;
const int N = 1e6 + 10;
int n;
int q[N];
void quick_sort(int l, int r){
if(l >= r) return;
int x = q[(l + r) / 2], i = l - 1, j = r + 1;
while(i < j){
do i++; while(q[i] < x);
do j--; while(q[j] > x);
if(i < j) swap(q[i], q[j]);
}
quick_sort(l, j);
quick_sort(j + 1, r);
}
int main(){
scanf("%d", &n);
for(int i = 0; i < n; i++){
scanf("%d", &q[i]);
}
quick_sort(0, n - 1);
for(int i = 0; i < n; i++){
printf("%d ", q[i]);
}
return 0;
}
#include <iostream>
using namespace std;
const int N = 1e6 + 10;
//1e6 + 10的目的是为了防止越界
//因为数据范围大所以数组的话范围声明得N内
int q[N];
//声明数组
void quick_sort(int q[], int l, int r){
if(l >= r) return;
// int x = q[(l + r) / 2];
//中间值取l或中间值都可以,这边取l
//因为加强数据了 所以得取中间值
int x = q[(l + r) / 2], i = l - 1, j = r + 1;
//这里为什么指向两侧呢,主要跟后面的写法有关系,因为边界性问题在考试期间不要浪费时间推,直接背就可以了
while(i < j){
//这里 do while 换成 while 的写法因为很多语言没有 do while 的写法
do i++; while(q[i] < x);
do j--; while(q[j] > x);
if(i < j) swap(q[i], q[j]);
}
quick_sort(q, l, j);
quick_sort(q, j + 1, r);
}
int main(){
int n;
scanf("%d", &n);
//当输入数据比较多的时候。尽量选择一种比较快的输入方式
//在C++里尽量用scanf来读入,不要用cin来读入
//在java内用bufferread比scanner快10倍20倍
for(int i = 0; i < n; i++){
scanf("%d", &q[i]);
}
quick_sort(q, 0, n - 1);
for(int i = 0; i < n; i++){
printf("%d ", q[i]);
}
return 0;
}