蓝桥杯中的合并排序问题

/*题目内容:

使用合并排序算法,对输入的n个数据进行按升序排序。

输入描述

分两行,第一行是整数n,第二行是n个整数,每个整数之间用空格间隔。

输出描述

按升序排序的n个整数

输入样例

8

9 8 7 6 5 4 3 2

输出样例

2 3 4 5 6 7 8 9*/

/*分析:合并排序中用到了分治,其中比较关键的两个部分是1:合并分组排序的递归2:将排序后的小数组合并

#include<stdio.h>
#define M 100

void Merge(int a[],int b[],int start,int mid,int last)
{
	int i = start,j = mid + 1,k = 0;
	while(i <= mid&&j <= last)
	{
		if(a[i] < a[j])
			b[k++] = a[i++];
		if(a[i] > a[j])
			b[k++] = a[j++];
	}
	while(i <= mid)//在分组长度不一致时保证所有元素都进入数组b中
	{
		b[k++] = a[i++];
	}
	while(j <= last)//在分组长度不一致时保证所有元素都进入数组b中
	{
		b[k++] = a[j++];
	}
	for(i = 0;i < k; i++)
		a[start + i] = b[i];
}

void MergeSort(int a[],int b[],int start,int last)
{
	int mid;
	if(start < last)
	{
		mid = (start + last)/2;
		MergeSort(a,b,start,mid);
		MergeSort(a,b,mid + 1,last);
		Merge(a,b,start,mid,last);
		//Copy(a,b,start,last);
	}
}

int main()
{
	int num,array[M],b[M];
	int i;
	scanf("%d",&num);
	for(i = 0;i < num; i++)
		scanf("%d",&array[i]);
	MergeSort(array,b,0,num - 1);
	for(i = 0;i < num; i++)
		printf("%d ",array[i]);
	return 0;
}

补充一句:合并排序的时间复杂度是O(nlogn)

时间: 2024-10-15 02:30:05

蓝桥杯中的合并排序问题的相关文章

蓝桥杯中的最大子段和问题

题目内容: 给定长度为n的整数序列,a[1...n], 求[1,n]某个子区间[i , j]使得a[i]+-+a[j]和最大.或者求出最大的这个和.例如(-2,11,-4,13,-5,2)的最大子段和为20,所求子区间为[2,4]. 输入描述 第一行为一个整数n,表示数组有n个数据,第二行依次输入n个整数 输出描述 计算出n个整数中连续k个数的最大和 输入样例 5 1 2 3 4 5 7 6 -5 5 8 -13 5 7 输出样例 15 14 分析:若记b[j]为由a中有元素1到元素j(1 <=

蓝桥杯:合并石子(区间DP+平行四边形优化)

http://lx.lanqiao.cn/problem.page?gpid=T414 题意:…… 思路:很普通的区间DP,但是因为n<=1000,所以O(n^3)只能拿90分.上网查了下了解了平行四边形优化:地址. 但是看不懂. 1 #include <bits/stdc++.h> 2 using namespace std; 3 typedef long long LL; 4 const LL INF = 100000000000000000LL; 5 LL dp[1010][101

四平方和

四平方和定理,又称为拉格朗日定理:每个正整数都可以表示为至多4个正整数的平方和.如果把0包括进去,就正好可以表示为4个数的平方和. 比如:5 = 0^2 + 0^2 + 1^2 + 2^27 = 1^2 + 1^2 + 1^2 + 2^2(^符号表示乘方的意思) 对于一个给定的正整数,可能存在多种平方和的表示法.要求你对4个数排序:0 <= a <= b <= c <= d并对所有的可能表示法按 a,b,c,d 为联合主键升序排列,最后输出第一个表示法 程序输入为一个正整数N (N

Java冒泡排序法

我写的大部分博客,基本上都是留作日后回忆知识点所用,当然,如果我的文章能帮到道友们!我会更加的开心,与荣幸!如果有错误之处,请海涵,并指出问题所在,看见后我必加以修改,感谢!共勉.一起进步! 之前看过的一篇博客之中,总结了排序的效率的问题,基本上(不说死) 冒泡<选择<插入<快速(快速排序法的效率最高) 冒泡排序法: 概念: 冒泡排序(Bubble Sort),是一种计算机科学领域的较简单的排序算法.它重复地走访过要排序的元素列,依次比较两个相邻的元素,如果他们的顺序(如从大到小.首字母

Java学习-046-日志抓取合并后排序问题解决方案之 --- log4j 二次定制,实现日志输出添加延时10ms

自3月25至今,已经好久没有写学习日志了,今天在写日志抓取合并的小方法,发现抓取后的日志并米有依据系统执行的日志顺序排序.日志抓取排列逻辑如下: 通过日志标识,从各个日志文件(例如 use.log,error.log 等)中获取所需日志列表 合并日志列表 升序排序 输出日志报告 结果最后获取日志信息后,发现实际产出结果与预期结果不相符,如下所示: 1 2016-04-10 22:54:23,042 - INFO - [main] [cn.ffp.autotest.api.report.Repor

2016 第七届蓝桥杯 c/c++ B组省赛真题及解题报告

2016 第七届蓝桥杯 c/c++ B组省赛真题及解题报告 勘误1:第6题第4个 if最后一个条件粗心写错了,答案应为1580. 条件应为abs(a[3]-a[7])!=1,宝宝心理苦啊.!感谢zzh童鞋的提醒. 勘误2:第7题在推断连通的时候条件写错了,后两个if条件中是应该是<=12 落了一个等于号.正确答案应为116. 1.煤球数目 有一堆煤球.堆成三角棱锥形.详细: 第一层放1个, 第二层3个(排列成三角形), 第三层6个(排列成三角形), 第四层10个(排列成三角形). -. 假设一共

线程基础:多任务处理(13)——Fork/Join框架(解决排序问题)

============== 接上文< 线程基础:多任务处理(12)--Fork/Join框架(基本使用)> 3. 使用Fork/Join解决实际问题 之前文章讲解Fork/Join框架的基本使用时,所举的的例子是使用Fork/Join框架完成1-1000的整数累加.这个示例如果只是演示Fork/Join框架的使用,那还行,但这种例子和实际工作中所面对的问题还有一定差距.本篇文章我们使用Fork/Join框架解决一个实际问题,就是高效排序的问题. 3-1. 使用归并算法解决排序问题 排序问题是

UVA 11997 K Smallest Sums 优先队列 多路合并

vjudge 上题目链接:UVA 11997 题意很简单,就是从 k 个数组(每个数组均包含 k 个正整数)中各取出一个整数相加(所以可以得到 kk 个结果),输出前 k 小的和. 这时训练指南上的一道题,这道题的简化版其实在 15 年的广东省省赛出现过,当时是以送分题的形式出现的,可我还是没能做出来,归根到底还是看书不够,接触的题型不够多. *************************************************************大白书上的讲解开始*******

线段树合并与分裂

http://blog.csdn.net/zawedx/article/details/51818475 由于上面这篇文章讲的很清楚了,不打算再讲一遍......骗访问量也要按基本法 利用这种动态开点的值域线段树可以解决一堆有序集合进行合并/分裂/查询k小的问题,最好用的就是在排序问题中. 例1 bzoj4552 m次排序,每次对一个区间升序或降序排序,最后询问一个位置的值. 有一种比较咸鱼的做法是二分答案然后转化为01序列来做,这里就不说了= = 我们可以把排序好的一坨当做一个有序集合,用一个