P1177 【模板】排序
P1177 【模板】排序
题目
将读入的 \(N\) 个数从小到大排序后输出。
输入
第一行为一个正整数 \(N\)。
第二行包含 \(N\) 个空格隔开的正整数 \(a_i\),为你需要进行排序的数。
输出
将给定的 \(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;
}

                
            
        
浙公网安备 33010602011771号