【算法】寻找K个最大的数组
2011-07-09 16:23
218 查看
1.问题描述: 有一堆未排序的数,前选择其中最大的K个进行输出。
2.问题解析:
快速排序:O(nlogn)
堆排序:O(nlogn)
但是老师说一般面试的答案是堆排,我也估计会快一些。
3.问题流程:
堆,是指根节点大于(或小于)其子节点的完全二叉树;最优二叉树是指左子树<根节点<右节点的二叉树。
先构建一个大根堆,然后取出堆顶元素,将堆顶和堆尾元素互换,维护大根堆。
建堆的过程是从数组一半,到最开始,每次刷堆。
刷堆的过程是,记录下待刷元素,然后于其子节点中比较大的那个进行比较,如果子节点大,则互换,并移动父子指针,直到最后。
4.代码:
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; }
相关文章推荐
- 算法训练 寻找数组中最大值
- 2016蓝桥杯算法训练——寻找数组中的最大值
- 算法训练 寻找数组中最大值
- 算法导论--寻找最大子数组
- 窥探算法之美妙——寻找数组中最小的K个数&python中巧用最大堆
- 蓝桥杯 ALGO-49 算法训练 寻找数组中最大值
- 蓝桥杯-算法训练 寻找数组中最大值
- 数据结构——算法之(041)(寻找数组中的最大值和最小值)
- 算法训练 寻找数组中最大值
- 【软件工程】代码复审与子数组最大和线性算法寻找问题
- 蓝桥杯--算法训练之ALGO-49 寻找数组中最大值
- 算法训练 寻找数组中最大值
- 算法训练 寻找数组中最大值
- 蓝桥杯习题集_ 算法训练 寻找数组中最大值
- 算法训练 寻找数组中最大值
- 算法训练 寻找数组中最大值
- 蓝桥杯 算法训练 寻找数组中的最大值
- 算法训练 寻找数组中最大值
- 算法训练 寻找数组中最大值
- 算法训练 寻找数组中最大值 (答案未定,欢迎指教)