• 堆排序


    堆排序:

     1 class HeapSort {
     2 public:
     3     void sink(vector<int>& nums, int i , int n ) {
     4         while(i*2+1 <n) {
     5             int j = i*2+1;
     6             if (j+1 < n && nums[j+1] > nums[j]) j++; //找到大的儿子
     7             if ( nums[i] < nums[j] ) { // 当前节点 小于儿子,下沉
     8                 swap(nums[i],nums[j]);
     9                 i = j;
    10             } else {
    11                 break;
    12             }
    13         }
    14     }
    15     void heap_sort(vector<int>& nums) {
    16         int N = nums.size();
    17         // build heap
    18         for(int i = N/2; i >= 0;i--) {
    19             sink(nums,i,N);
    20         }
    21         // sort 
    22         for(int n = N -1 ;n>=0;n--) {
    23             swap(nums[n],nums[0]);
    24             sink(nums,0,n);
    25         }
    26     } 
    27 };

     二叉树--->满二叉树--->完全二叉树---->堆有序的完全二叉树, 就叫做二叉堆。(最大堆:任意一个父节点都大于等于它相邻的所有子节点)

     数组表示

     在一个堆中,位置k的节点的父节点的位置是k/2, 而两个子节点的位置则分别是2k和2k+1

    层序遍历:

     

    新加元素: 上浮

    替换元素:下沉

     

    堆中插入元素:新元素加到数组末尾, 让这个新元素上浮到合适的位置

    堆中删除最大元素:数组顶端删除最大的元素,并将数组的最后一个元素放到顶端,让这个元素下沉到合适的位置

    堆排序: 通过下沉实现

    https://zhuanlan.zhihu.com/p/31440467

  • 相关阅读:
    分页实现
    jquery扩展提示框
    可拖拽可扩展面板
    单表查询结果转换成泛型集合
    压缩远程图片并返回
    windows下python安装架包的问题
    从网络上下载数据
    自己实现jquery
    如何利用拼音首字母查询数据库
    正则表达式
  • 原文地址:https://www.cnblogs.com/zle1992/p/16062549.html
Copyright © 2020-2023  润新知