zoukankan      html  css  js  c++  java
  • 排序算法要点

    第一篇: 堆排序


    二叉堆满足二个特性:
    1).父结点的键值总是大于或等于(小于或等于)任何一个子节点的键值。
    2).每个结点的左子树和右子树都是一个二叉堆(都是最大堆或最小堆)。


    堆排序的三个要点
    从小到大排序,要先建立最大堆。
    以构建最大堆为例

    1.堆调整
    以待排序节点开始,遍历子节点,把两个子节点值比较大的子节点向上移动。
    两个子节点都比该节点小,说明不用在调节了。注意,要保证这个步骤成立,本次堆调整时,子节点都是二叉堆。
    当然了,叶子节点一定是二叉堆(因为没有子节点)。
    还要注意一点是,一次调节交换可能会破坏子节点的有序性,所以每次调节都要调整到二叉树叶节点位置(当然,也可以是两个子节点都比该节点小时)。

    2.构建堆
    构建堆就是构建一个根节点位置开始的二叉堆。所以要先保证它的子节点也是二叉堆。
    void MakeMinHeap(int a[], int n) 

     for (int i = n / 2; i > 0; i--) 
      MinHeapFixdown(a, i, n); 
    }
    注意,构建的二叉堆的数组元素还不是排好顺序的,因为不能保证左子树和右子树的顺序。

    3.二叉堆排序
    二叉堆的根节点一定是最大的,将它换到数组末尾不再移动,将数据末尾的节点换到根节点,重新调整二叉堆。
    重复这个过程,直到数据全部移动到二叉堆的后面。
    for (int i = n; i > 1; i--) 

     swap(a[1], a[i]); 
     MinHeapFixdown(a, 1, i-1); 

  • 相关阅读:
    sql试题
    DataTable转换成实体类、List、DataSet等
    ASP.NET Web Pages 的冲突版本问题
    Linux系统中使用Xbox360手柄
    QT离线安装包
    美剧爬虫
    ROS串口通信
    Eclipse中STM32工程建立步骤
    AD模块电压采集电路
    一个串口小工具
  • 原文地址:https://www.cnblogs.com/fuhaots2009/p/3508794.html
Copyright © 2011-2022 走看看