[笔记][中国大学mooc][程序设计与算法(二) 算法基础][归并][归并排序] 输出前k大的数

总时间限制: 10000ms 单个测试点时间限制: 1000ms 内存限制: 65536kB

描述
给定一个数组,统计前k大的数并且把这k个数从大到小输出。

输入
第一行包含一个整数n,表示数组的大小。n < 100000。
第二行包含n个整数,表示数组的元素,整数之间以一个空格分开。每个整数的绝对值不超过100000000。
第三行包含一个整数k。k < n。

输出
从大到小输出前k大的数,每个数一行。

样例输入
10
4 5 6 9 8 7 1 2 3 0
5

样例输出
9
8
7
6
5

分析

做本题的时候出现了一个奇怪的问题,如果在程序中使用long long类型,那么排序是对无符号数的排序,即负数在前。如果使用long类型,在我自己的计算机上运行结果是正确的,但是提交无数次也通过不了,只有int可以

此外由于输出前k大的数,可能会想到用快速排序,但是开始排序有个问题,就是不能处理递归深度过深的序列。只能使用归并。

代码

#include<stdio.h>
#define MAXN 100000
int n, k;
int integral[MAXN];

//归并排序
void Merge(int ptr_head1, int ptr_head2, int ptr_tail){
	int ptr1 = ptr_head1, ptr2 = ptr_head2, ptr=0;
	int tempSquenceForMerge[ptr_tail-ptr_head1+1];
	while(ptr1<ptr_head2&&ptr2<=ptr_tail)
		tempSquenceForMerge[ptr++] = integral[ptr1]>integral[ptr2]?integral[ptr1++]:integral[ptr2++];
	while(ptr1<ptr_head2)
		tempSquenceForMerge[ptr++] = integral[ptr1++];
	while(ptr2<=ptr_tail)
		tempSquenceForMerge[ptr++] = integral[ptr2++];
	ptr=0;
	for(long cnt=ptr_head1; cnt<=ptr_tail; cnt++)
		integral[cnt]=tempSquenceForMerge[ptr++];
}
void MergeSort(int ptr_head, int ptr_tail){
	if(ptr_head >= ptr_tail) return;
	MergeSort(ptr_head, (ptr_head+ptr_tail)/2);
	MergeSort((ptr_head+ptr_tail)/2+1, ptr_tail);
	Merge(ptr_head, (ptr_head+ptr_tail)/2+1, ptr_tail);
}
int main(){
	scanf("%d", &n);
	for(int cnt=0; cnt<n; cnt++)
		scanf("%d", integral+cnt);
	scanf("%d", &k);
	MergeSort(0, n-1);
	for(int cnt=0; cnt<k; cnt++)
		printf("%d\n", integral[cnt]);
	return 0;
} 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值