#include<cstdio>
#include<iostream>
#include<cmath>
#include<algorithm>
#include<ctime>
#include<vector>
using namespace std;
#define N 100005
#define pi 3.14159
typedef long long ll;
int a[N];//存储原始数据和排序后的结果
int tmp[N];//暂存中间结果
void merge_sort(int* a, int low, int high)
{
if (low < high)
{
int mid = (low + high) >> 1;//将当前尚未处理的部分一分为二
merge_sort(a, low, mid);
merge_sort(a, mid + 1, high);
/*
* 先递归再处理,递归的作用就是进行分组
* 最终的效果是把数据一个一个分为一组,将相邻组进行排序,生成多组有序的元素段,除最后一组外每组两个元素
* 然后再将数据两个两个分为一组进行作同样处理,除最后一组外每组四个元素
* 以此类推,最终合并成一整个有序的元素段
*/
int i = low, j = mid + 1, k = 0;//i指向前一组的第一个元素,j指向后一组的第一个元素,组间已有序
while (i <= mid && j <= high)
{
//每次从两组中选择当前较小一个元素放入暂存数组
if (a[i] <= a[j]) tmp[k++] = a[i++];
else tmp[k++] = a[j++];
/*例如
* 一组是:3,8,10
* 另一组:2,4,5
* 依次选择:2,3,4,5,8,10合并成一个有序段
*/
}
while (i <= mid) tmp[k++] = a[i++];//两组长度不同时,剩余元素直接按序放后面
while (j <= high) tmp[k++] = a[j++];
i = low, k = 0;
while (i <= high) a[i++] = tmp[k++];//将部分有序的元素段归还
}
}
int main()
{
int n, i;//n为数据规模
scanf("%d", &n);
for (i = 0; i < n; i++)
scanf("%d", &a[i]);//输入
merge_sort(a, 0, n - 1);//处理
for (i = 0; i < n; i++)
printf("%d ", a[i]);//输出
return 0;
}
归并排序-从小到大
最新推荐文章于 2024-11-07 15:11:39 发布