排序算法———堆排序
时间复杂度为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 };