算法题目刷题:2,打印几个数组 ,前面最大的K个元素

//打印几个数组中,前面最大的K个数字
class PrintMaxTopK
{
	class HeadNode
	{
	public:
		int value;//结点的数值
		int arrNum;//当前是第几个数组
		int index;//数组的第几个下标
		HeadNode(int x,int y,int z):value(x),arrNum(y),index(z) {}		
	};
public:	
	void printTopK(vector <vector <int > >& matrix,int TopK)
	{
		int heapSize = matrix.size();	
		//********************************//创建新节点!!!!!!!!!!!!!!!!!111
		HeadNode *heap[3];
		/*for(int i=0;i<heapSize;i++)
		{
			heap[i]= new HeadNode(0,0,0);
		}*/
		//********************************
		for(int i=0;i < heapSize;i++)
		{
			int index = matrix[i].size()-1;
			heap[i] = new HeadNode( matrix[i][index], i, index );
			heapInsert(heap, i);
			//cout<<heap[i]->arrNum<<heap[i]->index<<heap[i]->value<<endl;
		}
		for(int i=0;i!=TopK;i++)
		{
			if(heapSize==0) 
				break;
			cout<<heap[0]->value;
			if(heap[0]->index !=0 )
			{
				heap[0]->value = matrix[heap[0]->arrNum][--heap[0]->index];
			}
			else
			{
				swap(heap[0],heap[--heapSize]);
			}
			heapify(heap,0,heapSize);///第二个参数为堆的大小			
		}	
	}
	void heapify(HeadNode *heap[],int left,int heapSize)///第二个参数为堆的大小
	{
		int Lchild = left*2+1;
		while( Lchild < heapSize)
		{
			int largest =  Lchild+1 < heapSize && heap[Lchild]->value < heap[Lchild+1]->value ?  Lchild+1 : Lchild;
			largest = heap[left]->value < heap[largest]->value ? largest:left;
			if(largest == left)
				break;			
			swap(heap[left],heap[largest]);
			left=largest;
			Lchild = left*2+1;
		}
	}
	void heapInsert(HeadNode *heap[], int i)
	{				
		while(heap[(i-1)/2]->value < heap[i]->value)
		{
			swap(heap[(i-1)/2] , heap[i]);
			i=(i-1)/2;
		}
	}

};
//打印几个数组中,前面最大的K个数字

这个题目着实的很吊。记忆深刻的heapinsrt,heapify,,指望这个堆排序的基本知识,过了华为面试,着实记忆深刻。。一个博学的大牛气质的工程师,给我抛出堆排序,用了三行代码,实现了heapinsert,代码简洁实用,很展现基本功

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值