sort

Time Limit: 6000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 45198    Accepted Submission(s): 13067


Problem Description
给你n个整数,请按从大到小的顺序输出其中前m大的数。
 

Input
每组测试数据有两行,第一行有两个数n,m(0<n,m<1000000),第二行包含n个各不相同,且都处于区间[-500000,500000]的整数。
 

Output
对每组测试数据按从大到小的顺序输出前m大的数。
 

Sample Input
5 3 3 -35 92 213 -644
 

Sample Output
213 92 3
Hint
请用VC/VC++提交
 

Author
LL
 

Source

思路:

做这道题就是想看一下堆排序和sort快排哪个更快一点.事实证明两个速度差不多,都是NlogN。

sort:


heapsort:


代码:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;

int h[1000000+5];
int n;

// heapsort  N(NlogN)

void swap(int x,int y)
{
	int t;
	t=h[x];
	h[x]=h[y];
	h[y]=t;
}

void siftdown(int i)//传入一个需要向下调整的节点编号 
{
	int t,flag=0;
	while(i*2<=n&&flag==0)
	{
		if(h[i]<h[i*2])
		{
			t=i*2;
		}
		else
		{
			t=i;
		}
		if(i*2+1<=n)
		{
			if(h[t]<h[i*2+1])
			{
				t=2*i+1;
			}
		}
		if(t!=i)
		{
			swap(t,i);
			i=t;
		}
		else 
		{
			flag=1;
		}
	}
}

void creat()
{
	int i;
	for(i=n/2;i>=1;i--)
	{
		siftdown(i);
	}
}

void heapsort()
{
	while(n>1)
	{
		swap(1,n);
		n--;
		siftdown(1);
	} 
}



int main()
{
	
	int num,m;
	while(~scanf("%d%d",&num,&m))
	{
		for(int i=1;i<=num;i++)
		{
			scanf("%d",&h[i]);
		}
		n=num;
		creat();
		heapsort();
		for(int i=num;i>num-m+1;i--)
		{
			printf("%d ",h[i]);
		}
		printf("%d\n",h[num-m+1]); 
	}
	return 0;	
} 


//    sort O(NlogN)
//int main()
//{
//	
//	int num,m;
//	while(~scanf("%d%d",&num,&m))
//	{
//		for(int i=1;i<=num;i++)
//		{
//			scanf("%d",&h[i]);
//		}
//		sort(h+1,h+1+num);
//		for(int i=num;i>num-m+1;i--)
//		{
//			printf("%d ",h[i]);
//		}
//		printf("%d\n",h[num-m+1]); 
//	}
//	return 0;	
//}