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;
}