100万个数中找出最大的前K个数-创新互联

 拿到这个题目我想到了很多方法,但是在我想到的方法中,要把在100万个数中找到前k个数,都不适用。最后通过我的不断研究,我想到了我认为最简单的方法,就是利用堆来做这道题目。

成都创新互联公司专注于企业营销型网站建设、网站重做改版、湛江网站定制设计、自适应品牌网站建设、H5开发商城网站定制开发、集团公司官网建设、外贸网站制作、高端网站制作、响应式网页设计等建站业务,价格优惠性价比高,为湛江等各大城市提供网站开发制作服务。

 下面我分析一下我用堆排序的思路:

   1.我先建一个大小为k的堆。

   2.把100万中前k个数放到这个堆中。

   3.把这个堆调成小堆。

   4.把100万个从k到100万之间的数字拿出来和堆的根结点作比较。

   5.如果根结点小于这之间的某一个数,就把这个数拿给根结点,然后继续调成小堆。否则继续找

   6.直到找完这100万个数,堆中放的就是大的前k个数。

代码如下:

//下调
void _AdjustDown(int *arr, int parent, int size)
{
	int child = 2 * parent + 1;
	while (child arr[child + 1])
		{
			child++;//保证是孩子结点大的一个节点
		}
		//交换
		if (arr[child] < arr[parent])
		{
			swap(arr[child], arr[parent]);
			parent = child;
			child = 2 * parent + 1;
		}
		else
		{
			break;
		}
	}
}
int* Find(int *arr, int k,int N)
{
	assert(arr);
	assert(k > 0);
	int *str = new int[k];
	//把前k个元素放在堆中
	for (int i = 0; i < k; i++)
	{
		str[i] = arr[i];
	}
	//调成最小堆
	for (int j = (k - 2) / 2; j >= 0; j--)
	{
		_AdjustDown(str, j, k);
	}
	//然后k到N的所有数与堆中的根结点相比较
	for (int n = k; n < N; n++)
	{
		if (str[0] < arr[n])//如果根结点小于堆中k到N中的某一元素
		{
			str[0] = arr[n];//把这个元素赋值给根结点
			_AdjustDown(str, 0, k);//再一次调成最小堆
		}
	}
	return str;
	delete[]str;
}

希望这个对你们有帮助。期待你们的回复,有什么不对的地方可以指出来啊。

创新互联www.cdcxhl.cn,专业提供香港、美国云服务器,动态BGP最优骨干路由自动选择,持续稳定高效的网络助力业务部署。公司持有工信部办法的idc、isp许可证, 机房独有T级流量清洗系统配攻击溯源,准确进行流量调度,确保服务器高可用性。佳节活动现已开启,新人活动云服务器买多久送多久。


名称栏目:100万个数中找出最大的前K个数-创新互联
分享链接:http://pwwzsj.com/article/doshjd.html