您的位置:首页 > 其它

【算法】寻找K个最大的数组

2011-07-09 16:23 218 查看
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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: