洛谷题单指南-排序-P1177 【模板】排序
原题链接:https://www.luogu.com.cn/problem/P1177
题意解读:数据量为100000,必须用小于等于N*logN复杂度的排序算法,可以直接用sort,更重要需要掌握快速排序的过程。
知识点:快速排序
设定数组q[n],l,r
第一步:确定分界点x
可以取q[l]、q[(l+r) / 2]、q[r]三种
第二步:调整区间
把<=x的数调整到左边区间,>=x的数调整到右边区间
第三步:递归处理
难点主要在第二步,有两种方法:
方法一:空间换时间
开两个数组a[],b[],遍历q[],将<=x的放到a数组,将>=x的放到b数组,然后依次遍历a、b数组把数填到q数组
方法二:头尾指针
定义两个下标i,j,指向数组头、尾,
q[i]如果<x,i一直++,直到遇到q[i]>=x
q[j]如果>x,j一直--,直到遇到q[j]<=x
然后swap(q[i], q[j])
重复以上过程,直到i、j相遇。
快速排序的代码有多种方式,下面给出一种比较简化的版本。
100分代码:
#include <bits/stdc++.h>
using namespace std;
const int N = 100005;
int a[N];
int n;
void quicksort(int l, int r)
{
if(l >= r) return;
int x = a[(l + r) / 2];
int i = l - 1, j = r + 1;
while(i < j)
{
do i++; while(a[i] < x);
do j--; while(a[j] > x);
if(i < j) swap(a[i], a[j]);
}
quicksort(l, j);
quicksort(j + 1, r);
}
int main()
{
cin >> n;
for(int i = 1; i <= n; i++) cin >> a[i];
//sort(a + 1, a + n + 1);
quicksort(1, n);
for(int i = 1; i <= n; i++)
{
if(i > 1) cout << " ";
cout << a[i];
}
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 【杂谈】分布式事务——高大上的无用知识?