排序算法(6)堆排序---选择排序的高级版

思想:利用数据结构堆的思想来排序,堆排序利用了大堆(或小堆)堆顶记录的关键字最大(或最小)这一特征,使得当前无序的序列中选择关键最大(或最小)的记录变得简单。(升序—建大堆,降序—建小堆),可以说是选择排序的高级版。

代码实现:

void swap(int array[], int a, int b);
void BuildHeap(int array[], int size);
void Down(int array[], int i, int n);
//堆排序算法函数
void HeapSort(int array[], int size)
{BuildHeap(array, size); // 初始化堆for (int i = size - 1; i > 0; i--){swap(array, 0, i); // 交换顶点和第 i 个数据// 因为只有array[0]改变,其它都符合大顶堆的定义,所以可以从上往下重新建立Down(array, 0, i); // 重新建立大顶堆}
}//建立大顶堆函数-总体
void BuildHeap(int array[], int size)
{for (int i = size / 2 - 1; i >= 0; i--){ // 从倒数第二排开始, 创建大顶堆,必须从下往上比较, 否则有的不符合大顶堆定义Down(array, i, size);}
}
// 建立大顶堆函数-分支
void Down(int array[], int i, int n)
{int parent = i;                    // 父节点下标int child = 2 * i + 1;            // 左边的子节点下标int child2 = 2 * i + 2;            // 右边的子节点下标while (child < n){if (child2 < n && array[child] < array[child + 1]){ // 判断子节点左和右哪个大,大的与父节点比较child++;}if (array[parent] < array[child]){ // 判断父节点是否小于子节点swap(array, parent, child);     // 交换父节点和子节点parent = child;                 // 子节点下标 赋给 父节点下标}child = child * 2 + 1; // 换行,比较下面的父节点和子节点}
}
//交换函数
void swap(int array[], int a, int b)//交换array数组中下标x和y的值
{int temp = array[a];array[a] = array[b];array[b] = temp;
}

排序算法(6)堆排序相关推荐

  1. 十大排序算法之堆排序

    十大排序算法之堆排序 本文采用Java书写选择排序,其他语言类似可以借鉴着写 思想:所谓堆排序就是通过构造最大堆(升序)或者最小堆(降序)来进行排列的方法.可能有些童鞋不知道何为最大堆,何为最小堆.这 ...

  2. Java常见排序算法之堆排序

    在学习算法的过程中,我们难免会接触很多和排序相关的算法.总而言之,对于任何编程人员来说,基本的排序算法是必须要掌握的. 从今天开始,我们将要进行基本的排序算法的讲解.Are you ready?Let ...

  3. 排序算法之---堆排序(很重要的一个结构,新手入门必备)

    排序算法之---堆排序(很重要的一个结构,新手入门必备) 先来简单的介绍一下堆结构: 堆排序是利用堆这种数据结构而设计的一种排序算法,堆排序是一种选择排序,它的最坏,最好,平均时间复杂度均为O(nlo ...

  4. 数据结构与算法:十大排序算法之堆排序

    数据结构与算法:十大排序算法之堆排序 堆排序可以说是选择排序的优化 package TopTenSortingAlgorithms;import java.util.Arrays; import ja ...

  5. 排序算法(五)——堆排序算法详解及Python实现

    本文目录 一.简介 二.算法介绍 三.代码实现 排序算法系列--相关文章 一.简介 堆排序(Heap Sort)算法,属于选择排序类,不稳定排序,时间复杂度O(nlogn). 堆排序由Floyd和Wi ...

  6. 常用排序算法之——堆排序

    堆与堆排序的原理,参考该博客: 白话经典算法系列之七 堆与堆排序 二叉堆是个完全二叉树,可以用一个数组来保存节点,不会浪费空间,能快速定位:本人用一个vector来代替数组,省去自己对内存的分配/重分 ...

  7. C/C++排序算法(6)堆排序

    常见排序算法总结(6)堆排序 一篇文章,带你搞懂 堆排序 (注:代码语言的选择不应该限制了我们对算法的理解) 文章附有动图!一看就懂! 堆排序的时间复杂度O(N*logN),额外空间复杂度O(1),是 ...

  8. c++ sort 从大到小排序_C语言必学的12个排序算法:堆排序(第7篇)

    题外话堆排序比之前的简单选择.冒泡算法.快速排序算法复杂一些,因为用到了树形数据结构,但是本文使用了数组实现完全二叉树,因此也比较简单.C语言初学者,可以简单了解其思想,具体的知识掌握可以参照数据结构 ...

  9. 堆排序重建堆的时间复杂度_排序算法之 堆排序 及其时间复杂度和空间复杂度-Go语言中文社区...

    堆排序是由1991年的计算机先驱奖获得者.斯坦福大学计算机科学系教授罗伯特.弗洛伊德(Robert W.Floyd)和威廉姆斯(J.Williams)在1964年共同发明了的一种排序算法( Heap ...

最新文章

  1. 用vs2010编译vigra静态库及简单使用举例
  2. 通过修改注册表提升SSD性能(Intel 5系列芯片组)
  3. NYOJ 128 前缀式计算
  4. Python3 Scrapy爬取猫眼TOP100代码示例
  5. Linux的top命令
  6. JAVA.Properties了解一下
  7. 基于MATLAB的turbo码代码,一种基于Simulink的Turbo码仿真实现
  8. 双十一,单身狗除了买买买,还能做什么?
  9. 怎样在DOS下查看屏蔽和开启端口了
  10. JAVA Eclipse如何安装Swing
  11. linux运行360wifi,Linux(Ubuntu)下的无线网络卡上的小米和360wifi教程
  12. jquery toggle_响应式WordPress主题教程–第6部分– jQuery Toggle菜单
  13. 前一个标签自动增加,后面的标签自动减小,如微信的群发功能
  14. html 定义列表dddt,DDD - 概述 - (一)
  15. 图像处理与分析--国内公司就业
  16. FPGA系统性学习笔记连载_Day8【4位乘法器、4位除法器设计】 【原理及verilog实现、仿真】篇
  17. Java hashCode是什么
  18. 1万条数据大概占多大空间_快递信息泄露背后:40元可买超4G简历数据
  19. 初学者刚开始如何正确运行pycharm
  20. 〖产品思维训练白宝书 - 产品思维认知篇⑧〗- 产品经理 日常面临的问题有哪些?

热门文章

  1. 微信H5棋牌类及app类推广链接在微信推广中遇到的问题讨论
  2. unity中文乱码问题解决
  3. 模型过拟合原因及解决办法
  4. CentOS8.4 Samba服务配置
  5. 不含 AAA 或 BBB 的字符串
  6. python字体大小_python 设置xlabel,ylabel 坐标轴字体大小,字体类型
  7. 嵌入式笔试面试题(不含编程题)
  8. 达芬奇的人生密码 观后感悟
  9. [ZT]关闭QQ图标大全
  10. Uniapp 与原生android的交互 和简单配置