力扣【1-2算法】 P1177 【模板】排序--并归排序

P1177 【模板】排序

## 题目描述

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

## 输入格式

第一行为一个正整数 N。

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

## 输出格式

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

## 样例 #1

### 样例输入 #1
5
4 2 4 5 1

### 样例输出 #1
1 2 4 4 5

## 提示

对于 20% 的数据,有 1 <= N <=10^3;

对于 100% 的数据,有 1<=N<=10^5,1<=ai<=10^9。

并归排序

并归排序大概是这样的流程

d44b57869ba34b49a52591f09d5c3686.png

题解

#include <stdio.h>

int a[600001],b[600001];

void merge(int left, int right) 
{
	int mid = (left + right) / 2;
	int i = left, j = mid + 1, temp = left;  
	while (i <= mid && j <= right) { //合并
		b[temp++]=a[i] <= a[j] ? a[i++]:a[j++];
	}
	while (i <= mid) { //还有剩余时,选择较小的放入b数组中
		b[temp++] = a[i++];
	}
	while (j <= right) { 
		b[temp++] = a[j++];
	}
	for (int i = left; i <= right; i++) { 
		a[i] = b[i];
	}
	return;
}
void mergeSort(int left,int right) 
{
	if (left < right) 
	{
		int mid = (left + right) / 2;
		mergeSort(left, mid);  //  先给左子序列排序。
		mergeSort(mid + 1, right); //再给右子序列排序。
		merge(left,right);  // 最后把两个子序列合并。
	}
	return ;
}
int main() 
{
	int n,i;
	scanf("%d",&n);
	for (i = 0; i < n; i++) {
		scanf("%d",&a[i]);
	}
	mergeSort(0, n-1);
	for (i=0;i<n;i++){
		printf("%d ",a[i]);
	}
	return 0;
}

3c0e9077cba64094ac514ed1f02a1fd6.png

  • 4
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值