AcWing 785.快速排序题解
题目描述
给定你一个长度为n的整数数列。
请你使用快速排序对这个数列按照从小到大进行排序。
并将排好序的数列按顺序输出。
输入格式
输入共两行,第一行包含整数 n。
第二行包含 n 个整数(所有整数均在1~109109范围内),表示整个数列。
输出格式
输出共一行,包含 n 个整数,表示排好序的数列。
数据范围
1≤n≤100000
输入样例:
5
3 1 2 4 5
输出样例:
1 2 3 4 5
快速排序的思路
利用的就是分治的思想,假定数组为q, l 和 r 分别代表了左右边界
- 选取标准值-可为x = q[l],q[r],q[l + r >> 1],随机值
- 将区间分为两段,分别满足不同的性质(例如升序,使得边界点左边的数小于等于x,右边的数大于等于x)
- 递归处理
代码如下:
1 #include <iostream> 2 #include <algorithm> 3 using namespace std; 4 5 const int inf = 100010; 6 7 void quickSort(int q[], int l, int r){ 8 if(l >= r) return; 9 int i = l - 1, j = r + 1, x = q[l + r >> 1]; 10 while(i < j){ 11 do ++i; while(x > q[i]); 12 do --j; while(x < q[j]); 13 if(i < j) swap(q[i], q[j]); 14 } 15 quickSort(q, l, j); quickSort(q, j + 1, r); 16 } 17 int main(){ 18 int n; 19 int arr[inf]; 20 cin >> n; 21 for(int i = 0; i < n; ++i) 22 cin >> arr[i]; 23 quickSort(arr, 0, n - 1); 24 for(int i = 0; i < n; ++i) 25 cout << arr[i] << " "; 26 return 0; 27 }
需要注意的是,选取标准值的时候如果选取的是两端的边界值要注意划分的区间问题,否则会无限递归!