P1177 【模板】排序

P1177 【模板】排序

题目

将读入的 N 个数从小到大排序后输出。

输入

第一行为一个正整数 N

第二行包含 N 个空格隔开的正整数 ai,为你需要进行排序的数。

输出

将给定的 N 个数从小到大输出,数之间空格隔开,行末换行且无空格。

样例

输入

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;
}
posted @   IronMan_PZX  阅读(62)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
Title
点击右上角即可分享
微信分享提示