P1177 【模板】排序
P1177 【模板】排序
题目
将读入的
输入
第一行为一个正整数
第二行包含
输出
将给定的
样例
输入
5
4 2 4 5 1
输出
1 2 4 4 5
思路一:分治
代码
#include <bits/stdc++.h>
using namespace std;
int n,a[1000005],b[1000005];
void Merge(int l, int mid, int r)
{
int i = l, j = mid + 1;
for (int k = l; k <= r; k ++ )
{
if (j > r || (i <= mid && a[i] < a[j]))
b[k] = a[i ++];
else
b[k] = a[j ++];
}
for (int k = l; k <= r; k ++ )
a[k] = b[k];
}
void Msort(int l, int r)
{
if (l == r)
return;
int mid = l + (r - l) / 2;
Msort(l, mid);
Msort(mid + 1, r);
Merge(l, mid, r);
}
int main()
{
cin >> n;
for (int i = 1; i <= n; i ++ )
cin >> a[i];
Msort(1, n);
for (int i = 1; i <= n; i ++ )
cout << a[i] << ' ';
return 0;
}
思路二:快速排序
在数组中选取一个参照值,将比这个值小的元素都转移到数组左侧,比这个值大的转移到数组右侧。
此时数组分为三个部分,将左侧数组和右侧数组作为新数组按照上面的思路进行递归。
代码
#include <bits/stdc++.h>
using namespace std;
int n, a[100005];
void qsort(int l, int r)
{
int mid = a[l + (r - l) / 2]; // 将数组分成两部分,取中间数做参照数
int i = l, j = r; // 从两个子数组的两端开始与参数数对比
while (i <= j)
{
while (a[i] < mid)
i ++; // 找到左边大于等于 mid 的数
while (a[j] > mid)
j --;//找到右边小于等于 mid 的数
if (i <= j) // 交换两个数
{
swap(a[i], a[j]);
i ++;
j --;
}
} // 完成已 mid 为参照,保证左区间的数 < mid < 右区间的数
if (l < j)
qsort(l,j); // 继续分治,将左区间递归处理
if (i < r)
qsort(i,r); // 将右区间递归处理
}
int main()
{
cin >> n;
for (int i = 1; i <= n; i ++ )
cin >> a[i];
qsort(1, n);
for (int i = 1; i <= n; i ++ )
cout << a[i] << ' ';
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现