每日一题-合并排序


title: 每日一题–合并排序
date: 2019-11-02 23:53:02
tags:

  • 算法
  • 每日一题

73.合并排序 (10分)
C时间限制:3000 毫秒 | C内存限制:3000 Kb
题目内容:
使用合并排序算法,对输入的n个数据进行按升序排序。
输入描述
分两行,第一行是整数n,第二行是n个整数,每个整数之间用空格间隔。
输出描述
按升序排序的n个整数
输入样例
8
9 8 7 6 5 4 3 2
输出样例
2 3 4 5 6 7 8 9


#include <stdio.h>
 
int n, a[100];

//合并 
void fun02(int m, int n, int tmp){
	
	/*
		a: 待排序的数组 
		m:左起点
		n: 右终点
		tmp: 中间位置坐标
		b: 临时数组,用来记录排好序的队列	
	*/
	
	int b[100], k = 0, i = m, j = tmp + 1;
	
	//先打擂台,直至一方全军覆没 
	while(i <= tmp && j <= n){
		if(a[i] < a[j]){
			b[k++] = a[i++];
		}else{
			b[k++] = a[j++];
		}
	}
	
	//将剩下的强者全部加入数组 
	while(i <= tmp){
		b[k++] = a[i++];
	}
	while(j <= n){
		b[k++] = a[j++];
	}
    
	//将排好序的数组填入初始数组 
	k = 0;
	for(int pos = m; pos <= n; pos++){
		a[pos] = b[k++];
	}
}


void fun01(int m, int n){
	
	//当只剩下一个数的时候,默认已经排好序 
	if(m >= n){
		return;
	}
	//一分为二 
	int tmp = (n + m) / 2;
	//先排左边 
	fun01(m, tmp);
	//再排右边 
	fun01(tmp + 1, n);
	//合并排好序的数组 
	fun02(m, n, tmp);
	
}


int main(){
	
	scanf("%d", &n);

	for(int i = 0; i < n; i++){
		scanf("%d", &a[i]);
	}
	
	fun01(0, n - 1);

	for(int 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、付费专栏及课程。

余额充值