1. 程式人生 > >研究生畢業前一日三題:2,列印幾個陣列 ,前面最大的K個元素

研究生畢業前一日三題: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,程式碼簡潔實用,很展現基本功