第一篇博客诶!!!

点击查看代码
using namespace std;
const int N = 100010;
int n;
int q[N];
void quick_sort(int q[], int l, int r){
if(l >= r) return; //只有一个数或者没有数时则不用去遍历了
//int x = q[l]; //会超时 有两组数据不通过
int x = q[(l+r)>>1]; //确定分界点x
int i = l-1, j = r+1; //两个指针i和j先放到边界的左右两侧
while(i < j){ //每次迭代(每次移动和交换 算一次迭代)
do{
i++;
}while(q[i] < x); //i从左向右走
do{
j--;
}while(q[j] > x); //j从右向左走
if(i < j) swap(q[i], q[j]); //交换i和j所指向的数
}
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;
}
/*听课记录:
快速排序
基于分治的思想
1. 确定分界点x:取法有 q[l] 、q[(l+r)/2]、 q[r] 、 随机 四种方式
2. 调整区间:使左边区间中的数都<=x,右边区间中的数都>=x(重点!)
3. 递归处理左右两段
调整区间的一种方法(暴力做法 需额外的空间)(时间上线性)
1. a[] b[]
2. q[l~r]: q[i]<=x,x->a[]; q[i]>x,x->b[];
3. a[]->q[]; b[]->q[];
调整区间的一种优美的做法:
|__________________________|
L R
i j
---> i j <---
i从左向右走,i所指值小于x则继续走,i所指值大于x则停下
j开始从右向左走,j所指值大于x则继续走,j所指值小于x则停下
交换i和j所指向的数 使用swap函数
i和j分别向右和向左移动一位
i继续开始走...
重复过程 直至i和j相遇或穿过为止
其中任一时刻,i左边的数都小于x,j右边的数都大于x
*/
- 注意边界的处理,防止死循环
- 递归处理左右两侧
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 【.NET】调用本地 Deepseek 模型
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库
· DeepSeek “源神”启动!「GitHub 热点速览」
· 上周热点回顾(2.17-2.23)