堆排序

来源:互联网 发布:bi工具竞品 知乎 编辑:程序博客网 时间:2024/05/22 14:15

研究了一下堆排序,也没有想象的那么难嘛

以求最小的k个数为例。

class Solution {public:    vector<int> GetLeastNumbers_Solution(vector<int> input, int k) {        vector<int> ans;        if (input.size() < k) return ans;                //建堆,0为根结点,堆大小为k(大根堆),其实也是从叶子结点开始调整堆          for (int i = k / 2; i >= 0; --i) {            adjust(input, i, k);        }                for (int i = k; i < input.size(); ++i) {            if (input[i] < input[0]) {//当小于堆顶时,交换,并调整堆                  swap(input[i], input[0]);                adjust(input, 0, k);            }        }                for (int i = 0; i < k; ++i)            ans.push_back(input[i]);        return ans;    }        void adjust(vector<int>& input, int pos, int length) {        int le = pos * 2;//左右孩子结点          int ri = pos * 2 + 1;        int mmax = pos;                //三个if查看当前子树是否为最大堆,不是的话就往下调整          if (le < length && input[le] > input[mmax])            mmax = le;        if (ri < length && input[ri] > input[mmax])            mmax = ri;        if (mmax != pos) {            swap(input[mmax], input[pos]);            adjust(input, mmax, length);        }    }};