造论子都差点忘记堆排序,一次取头只能取最大或最小,数组本身非排序的

class Solution {
  public:
      //  这里使用堆排序(最小堆)
    vector<int> GetLeastNumbers_Solution(vector<int> input, int k) {
      std::vector<int> res;
        //  两个特殊边界
      if (k == 0 || input.empty()) {
        return res;
      }
      
      int size = input.size();
      
      for (int i = 0; i < k; ++i, --size) {
        min_heap_sort(input, size);
        res.push_back(input[0]);
        std::swap(input[0], input[size - 1];
        // input[0] ^= input[size - 1];
        // input[size - 1] ^= input[0];
        // input[0] ^= input[size - 1];
      }
      
      return res;
    }
  private:
    void min_heap_sort(std::vector<int> &input, int size) {
      for (int i = (size >> 1) - 1; i >= 0; --i) {
        sink(input, i, size);
      }
    }
    
    void sink(std::vector<int> &input, int parent, int size) {
      while ((parent << 1) + 1 < size) {
        int child = (parent << 1) + 1;
        
        if (child + 1 < size && input[child] > input[child + 1]) {
          ++child;
        }
        
          //  等于的情况可交换可不交换,为了异或正常,排除等于的情况
        if (input[parent] <= input[child]) {
          break;
        }
        
        // input[parent] ^= input[child];
        // input[child] ^= input[parent];
        // input[parent] ^= input[child];
        
        std::swap(input[parent], input[child]);
        
        parent = child;
      }
    }
};

改进:

class Solution {
  public:
    vector<int> GetLeastNumbers_Solution(vector<int> input, int k) {
      std::vector<int> res;
      int size = input.size();
      
      if (input.empty() || k <= 0) {
        return res;
      }
      //  构建堆
      init_heap(input);
      
      for (int i = 0; i < k; ++i) {
        //  堆头元素是最小
        res.push_back(input[0]);
        //  调整堆
        adjust_heap(input, --size);
      }
      
      return res;
    }
  private:
    void sink(std::vector<int> &res, int node, int size) {
      while ((node << 1) + 1 < size) {
        int child = (node << 1) + 1;
        if (child + 1 < size && res[child] > res[child + 1]) {
          ++child;
        }
        if (res[node] <= res[child]) {
          break;
        }
        std::swap(res[node], res[child]);
        node = child;
      }
    }
    void init_heap(std::vector<int> &res) {
      int size = res.size();
      for (int i = (size >> 1) - 1; i >= 0; --i) {
        sink(res, i, size);
      }
    }
    void adjust_heap(std::vector<int> &res, int size) {
      std::swap(res[0], res[size]);
      sink(res, 0, size);
    }
};