排序算法(6)堆排序
排序算法(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)堆排序相关推荐
- 十大排序算法之堆排序
十大排序算法之堆排序 本文采用Java书写选择排序,其他语言类似可以借鉴着写 思想:所谓堆排序就是通过构造最大堆(升序)或者最小堆(降序)来进行排列的方法.可能有些童鞋不知道何为最大堆,何为最小堆.这 ...
- Java常见排序算法之堆排序
在学习算法的过程中,我们难免会接触很多和排序相关的算法.总而言之,对于任何编程人员来说,基本的排序算法是必须要掌握的. 从今天开始,我们将要进行基本的排序算法的讲解.Are you ready?Let ...
- 排序算法之---堆排序(很重要的一个结构,新手入门必备)
排序算法之---堆排序(很重要的一个结构,新手入门必备) 先来简单的介绍一下堆结构: 堆排序是利用堆这种数据结构而设计的一种排序算法,堆排序是一种选择排序,它的最坏,最好,平均时间复杂度均为O(nlo ...
- 数据结构与算法:十大排序算法之堆排序
数据结构与算法:十大排序算法之堆排序 堆排序可以说是选择排序的优化 package TopTenSortingAlgorithms;import java.util.Arrays; import ja ...
- 排序算法(五)——堆排序算法详解及Python实现
本文目录 一.简介 二.算法介绍 三.代码实现 排序算法系列--相关文章 一.简介 堆排序(Heap Sort)算法,属于选择排序类,不稳定排序,时间复杂度O(nlogn). 堆排序由Floyd和Wi ...
- 常用排序算法之——堆排序
堆与堆排序的原理,参考该博客: 白话经典算法系列之七 堆与堆排序 二叉堆是个完全二叉树,可以用一个数组来保存节点,不会浪费空间,能快速定位:本人用一个vector来代替数组,省去自己对内存的分配/重分 ...
- C/C++排序算法(6)堆排序
常见排序算法总结(6)堆排序 一篇文章,带你搞懂 堆排序 (注:代码语言的选择不应该限制了我们对算法的理解) 文章附有动图!一看就懂! 堆排序的时间复杂度O(N*logN),额外空间复杂度O(1),是 ...
- c++ sort 从大到小排序_C语言必学的12个排序算法:堆排序(第7篇)
题外话堆排序比之前的简单选择.冒泡算法.快速排序算法复杂一些,因为用到了树形数据结构,但是本文使用了数组实现完全二叉树,因此也比较简单.C语言初学者,可以简单了解其思想,具体的知识掌握可以参照数据结构 ...
- 堆排序重建堆的时间复杂度_排序算法之 堆排序 及其时间复杂度和空间复杂度-Go语言中文社区...
堆排序是由1991年的计算机先驱奖获得者.斯坦福大学计算机科学系教授罗伯特.弗洛伊德(Robert W.Floyd)和威廉姆斯(J.Williams)在1964年共同发明了的一种排序算法( Heap ...
最新文章
- 用vs2010编译vigra静态库及简单使用举例
- 通过修改注册表提升SSD性能(Intel 5系列芯片组)
- NYOJ 128 前缀式计算
- Python3 Scrapy爬取猫眼TOP100代码示例
- Linux的top命令
- JAVA.Properties了解一下
- 基于MATLAB的turbo码代码,一种基于Simulink的Turbo码仿真实现
- 双十一,单身狗除了买买买,还能做什么?
- 怎样在DOS下查看屏蔽和开启端口了
- JAVA Eclipse如何安装Swing
- linux运行360wifi,Linux(Ubuntu)下的无线网络卡上的小米和360wifi教程
- jquery toggle_响应式WordPress主题教程–第6部分– jQuery Toggle菜单
- 前一个标签自动增加,后面的标签自动减小,如微信的群发功能
- html 定义列表dddt,DDD - 概述 - (一)
- 图像处理与分析--国内公司就业
- FPGA系统性学习笔记连载_Day8【4位乘法器、4位除法器设计】 【原理及verilog实现、仿真】篇
- Java hashCode是什么
- 1万条数据大概占多大空间_快递信息泄露背后:40元可买超4G简历数据
- 初学者刚开始如何正确运行pycharm
- 〖产品思维训练白宝书 - 产品思维认知篇⑧〗- 产品经理 日常面临的问题有哪些?