【算法】寻找K个最大的数组

 1.问题描述:

    有一堆未排序的数,前选择其中最大的K个进行输出。

2.问题解析:

    快速排序:O(nlogn)

   堆排序:O(nlogn)

   但是老师说一般面试的答案是堆排,我也估计会快一些。

3.问题流程:

   堆,是指根节点大于(或小于)其子节点的完全二叉树;最优二叉树是指左子树<根节点<右节点的二叉树。

   先构建一个大根堆,然后取出堆顶元素,将堆顶和堆尾元素互换,维护大根堆。

   建堆的过程是从数组一半,到最开始,每次刷堆。

   刷堆的过程是,记录下待刷元素,然后于其子节点中比较大的那个进行比较,如果子节点大,则互换,并移动父子指针,直到最后。

4.代码:   

void heapSort(int unSort[],int n,int i) 
{
	int x=unSort[i];
	int j=2*i+1;
    
	while(j<=n-1)
	{
		//×¢ÒâÔ½½çÅжÏ
		if ((j<n-1)&&(unSort[j]<unSort[j+1])) j=j+1;

		if (unSort[j]>x)
		{
			unSort[i]=unSort[j];
			i=j;
			j=2*i+1;
		}
		else
			j=n;
	}
	unSort[i]=x;
}


int * SelectKNumber(int unSort[],int k,int length)
{
    int i;
	int *Sort;
	
	Sort=new int[k];
  
	for (i=length/2;i>=0;i--)
	{
		heapSort(unSort,length,i);
	}

	for (i=0;i<k;i++)
	{
		Sort[i]=unSort[0];
		unSort[0]=unSort[length-i-1];
		unSort[length-i-1]=Sort[i];
		heapSort(unSort,length-i-2,0);
	}

	return Sort;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值