排序算法———堆排序

时间复杂度为O(nlogn)的堆排序,是种不稳定的排序。原理为将数组想象为一棵二叉树,将子节点与父节点比较大小并交换。

举例:序列编号为 0 1 2 3 4 5 6 7  值为 4 5 1 6 2 7 3 8

编号化为树结构为:

       0

    1      2

  3   4   5   6

7

7的父节点为3((7-1)/2),实际上所有子节点i的父节点编号为(i-1)/2

值化为树结构为:

       4

    5     1

  6   2   7   3

8

求最小堆第一次排序结果为:

      1

    2    4

  6  5  7  3

8

后可以将最小值1放在最后的位置,即与8交换,并对前7个再次排序。

最终得到递减序列。

上代码

 1 class Solution {    //该代码为用堆排序得到前k个最小的数
 2 public:
 3     int heapsort(vector<int> &v, int i){    //堆排序的一次排序
 4         for(;i>0;--i){            //从第i号向前排序
 5             if(v[i]<v[(i-1)/2])
 6                 swap(v[i],v[(i-1)/2]);
 7         }
 8         return v[0];
 9     }
10     vector<int> GetLeastNumbers_Solution(vector<int> input, int k) {
11         vector<int> v;
12         if(input.size()<k){
13             return v;
14         }
15         v.reserve(k);
16         for(int i=0;i!=k;++i){
17             v.push_back(heapsort(input,input.size()-i-1));
18             swap(input[0],input[input.size()-i-1]);
19         }
20         return v;
21     }
22 };   

 

posted @ 2016-10-31 21:30  爱吃土豆的男孩  阅读(184)  评论(0编辑  收藏  举报