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;
}
标签:int,mid,P1177,数组,排序,模板
From: https://www.cnblogs.com/IronMan-PZX/p/18120090