遇到的问题
-
不知道模板一开始,自己按照一直传统算法写,现在学会了模板。
-
边界问题 一开始的时候 x 取 l + r >> 1, 不要取 x = l 会陷入死循环超时!!
-
注意只含有0或1个元素情况
步骤
- 确定临界(不要陷入死循环 超时)
- 改变移动区间 交换临界点
- 递归
代码
#include<iostream>
using namespace std;
const int N = 1e6 + 10;
int n;
int q[N];
void quick_sort(int q[], int l, int r)
{
if(l >= r) return; //特殊情况--针对1或0个数
// Step1:确定分界点
int x = q[l + r >> 1], i = l - 1, j = r + 1; //偏移量 扩一个 因为总要移动
// Step2: 调整区间
while (i < j)
{
do i++ ; while (q[i] < x);
do j-- ; while (q[j] > x);
if(i < j) swap(q[i], q[j]);
}
// Step3: 递归处理左右两边
quick_sort(q, l, j);
quick_sort(q, j+1, r);
}
int main()
{
scanf("%d", &n); //输入数据比较多时,建议
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;
}