堆排序:
    一种实现堆排序的方法为:使用标准库中的优先级队列:
    首先要包含头文件#include,
    它和queue不同的就在于我们可以自定义其中数据的优先级, 让优先级高的排在队列前面,优先出队。
    定义:priority_queue
    例:
    priority_queue ,greater> q;//greater代表升序队列,即小顶堆
    priority_queue ,less > q; //less代表降序队列,为大顶堆
    而最基础的是堆排序最初的定义:
    步骤如下:
    给出数组:6,8,7,9,0,1,3,2,4,5 进行堆排序
    一、
    首先将其看做一颗完全二叉树:
    二、
    调整至初始大根堆,此时堆顶数最大
    三、
    将堆顶放至数组末尾,剩余的数继续调整为大根堆
    四、
    全部调整完毕,输出结果
    调整过程:
    由根节点开始,依次向下调整,保证根节点为最大值

    1. /*--------调整堆---------*/
    2. void shift(vector<int>& v, int i, int len) {//调整堆
    3. int left = i * 2 + 1;
    4. int right = i * 2 + 2;
    5. int max_index = i;
    6. if (left<len&&v[left]>v[max_index])
    7. max_index = left;
    8. if (right<len&&v[right]>v[max_index])
    9. max_index = right;
    10. if (max_index != i) {
    11. swap(v[i], v[max_index]);
    12. shift(v, max_index, len);
    13. }
    14. }
    15. /*--------循环建立大根堆---------*/
    16. void build(vector<int>& v, int len) {//最初建堆
    17. int start = len / 2 + 1;
    18. for (; start >= 0; --start) {//从最后一个非叶子节点向上,直到第一节点
    19. shift(v, start, len);
    20. }
    21. }
    22. void heap_sort(vector<int>& v) {//堆排序
    23. int len = v.size();
    24. build(v, len);
    25. for (int i = len - 1; i >= 1; --i) {
    26. swap(v[0], v[i]);
    27. shift(v, 0, i);
    28. }
    29. }
    30. //测试:
    31. int main(){
    32. vector<int> arr = { 3, 5, 3, 0, 8, 6, 1, 5, 8, 6, 2, 4, 9, 4, 7, 0, 1, 8, 9, 7, 3, 1, 2, 5, 9, 7, 4, 0, 2, 6 };
    33. heap_sort(arr);
    34. for (int i = 0; i < arr.size(); i++)
    35. cout << arr[i] << ' ';
    36. cout << endl;
    37. return 0;
    38. }