//打印几个数组中,前面最大的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,代码简洁实用,很展现基本功