归并排序-从小到大

#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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值