排序方法之堆排序

2023-05-16

堆排序的实现
(—)创建初始堆
(二)堆排序

在创建初始堆之前首先要了解一些关于堆的概念,还需要了解一些关于平衡二叉树的内容
 (1)堆的节点数 =n/2; 并且是只舍不入;
 (2)最后一个堆结点=(n/2)-1;
  (3)对于任意结点a[x],可以找到它子结点上的内容a[2x+1]和a[2x+2]

(——)创建一个堆

实现原理:
它考察堆的各个结点并且使之成为一个堆。这意味着各个结点的值无论何时小于它的子结点的值,都要对此节点与最大的子节点进行交换。对于每个结点,要检查是否应该改变,并且递归检查引起变化的子节点。

此代码重新排列了数组data内的内容,使各个结点的值都大
于其子结点的值,有效的创建了一个堆
 int i,j,j2,k;
   int tmp;
//外循环  :考虑所有的结点,从最后一个开始,直到根部
   for(k =(n>>1)-1;k>=0;k--)
      {
          //评价至该结点的k个点
           // k子女上的j2+1 与j2+2 结点
        tmp =data[k];
        //内循环:对于每个变化的结点,循环检查引起变
化的子节点
      for( j=k;(j<<1)<=n-2;j=i)
         {
                //查找节点k的最大子女
             j2 = j<<1;
             if(j2+2>n-1)//只有一个子女
               i=j2+1;
             else
                 { //有两个子女
                if(data[j2+1]<data[j2+2])
                      i=j2+2;
                else
                  i=j2+1;
                 }
                 //此时,i指向具有最大值的子女
              if(tmp<data[i])
               data[j]= data[i];
              else
                   break;
         }
        data[j]= tmp;
     }


(二)堆排序

实现原理:
 取堆的的根节点,也就是数组中最大的数,把它与数组中的最后一个元素交换。这个元素是最后一个结点最后一个树叶的子女。此时,前根元素恰好位于它应在的位置。但是要对新堆进行判断。方法同创建堆中的内循环相同。当新堆的重新判断完成后,再一次得到根元素,且把它与最后一个结点的最后一个页结点交换。

for(k=n-1;k>0;k--)
     {
       //至数组后部(已排序)的k个结点
       //根部与后部的元素交换
       tmp = data[k];
       data[k] =data[0];
         //再把数组压入堆中
       for(j=0;(j<<1) <= k-2;j=i)
           {
            j2 =j<<1;
            if( j2+2 > k-1 )
                i=j2+1;
            else
                {
               if(data[j2+1]<data[j2+2])
                     i=j2+2;
               else
                     i=j2+1;
                }
               
              if(tmp<data[i])
                   data[j]=data[i];
              else
                   break;              
           }


           data[j]=tmp;
     }
    for(j=0;j<n;j++)
       cout<<data[j];
  }

下面是堆排序的完整实现的代码示例。
#include<iostream>
using namespace std;
  void  heapsort(int *data,int  n )
  {
   int i,j,j2,k;
   int tmp;
//外循环  :考虑所有的结点,从最后一个开始,直到根部
   for(k =(n>>1)-1;k>=0;k--)
      {
          //评价至该结点的k个点
           // k子女上的j2+1 与j2+2 结点
        tmp =data[k];
        //内循环:对于每个变化的结点,循环检查引起变


化的子节点
      for( j=k;(j<<1)<=n-2;j=i)
         {
                //查找节点k的最大子女
             j2 = j<<1;
             if(j2+2>n-1)//只有一个子女
               i=j2+1;
             else
                 { //有两个子女
                if(data[j2+1]<data[j2+2])
                      i=j2+2;
                else
                  i=j2+1;
                 }
                 //此时,i指向具有最大值的子女
              if(tmp<data[i])
               data[j]= data[i];
              else
                   break;
         }
        data[j]= tmp;
     }
   


   for(k=n-1;k>0;k--)
     {
       //至数组后部(已排序)的k个结点
       //根部与后部的元素交换
       tmp = data[k];
       data[k] =data[0];
         //再把数组压入堆中
       for(j=0;(j<<1) <= k-2;j=i)
           {
            j2 =j<<1;
            if( j2+2 > k-1 )
                i=j2+1;
            else
                {
               if(data[j2+1]<data[j2+2])
                     i=j2+2;
               else
                     i=j2+1;
                }
               
              if(tmp<data[i])
                   data[j]=data[i];
              else
                   break;              
           }


           data[j]=tmp;
     }
    for(j=0;j<n;j++)
       cout<<data[j];
  }
 int main()

    int data[10]={9,6,3,8,5,2,7,4,1,0};
     heapsort(data,10); 
  return 0;
}
(三)
堆排序的优缺点
其复杂度为O(nlog2n),也适合较小量的数据
优点:
(1)平均情形和最坏情形时效率都很高。
 (2)运行时占用内存较少
缺点:
(1)算法不稳定
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

排序方法之堆排序 的相关文章

  • IDEA显示当前类中所有的方法列表

  • 搜狐畅游2019校招笔试题-游戏开发工程师(java)

    题目描述 xff1a 一组无序的自然数集合 xff0c 由0 xff0c 1 xff0c 2 xff0c xff0c xff0c xff0c n的数字和一个的数字X组成 xff0c 请从集合中找出这个重复的数字X 例子 xff1a 输入 x
  • 毕业设计

    1 搭建eclipse xff0c 思考基本功能实现 基本功能 xff1a 2 考虑用不用maven xff0c 导jar包容易一些 3 前后端交互 xff0c xff08 登陆 xff0c 注册 xff0c xff0c xff0c xff
  • 今日头条面试

    问题 xff1a 矿泉水1块钱1瓶 xff0c 喝完以后 xff0c 2个空瓶子可以换一瓶新矿泉水 问 xff1a 花10块钱最后最多能得多少瓶矿泉水 解答 xff1a public class Main public static voi
  • 将mac os 中的mysql 彻底删除

    执行下列命令 sudo rm usr local mysqlsudo rm rf usr local mysql sudo rm rf Library StartupItems MySQLCOMsudo rm rf Library Pref
  • MarkDown的使用

    标题 在需要的文字前增加 以及一个空格 一级标题 二级标题 效果 xff1a 一级标题 二级标题 列表 无序列表加 xff0c 有序列表加1 列表 列表 列表 1 列表 1 列表 2 列表 效果 xff1a 列表 列表 列表 列表 列表 列
  • css,html,js实用锦囊

    一 好看的按钮 lt DOCTYPE html gt lt html gt lt head gt lt meta charset 61 34 utf 8 34 gt lt title gt HTML CSS Exercise CSS3 bu
  • VMware虚拟机centos克隆完之后网卡eth0的配置以及主机名的配置

    配置完这些就可以了 第一 配置主机名 vim etc hostname 修改主机名 hadoop4 第二 配置网卡的MAC地址 vi etc udev rules d 70 persistent net rules 修改成如下的内容 SUB
  • 启动zookeeper,但是状态显示报错:Error contacting service. It is probably not running

    问题描述 xff1a 安装zookeeper 3 4 10的时候 xff0c 启动正常没报错 xff0c 但zkServer sh status查看状态的时候却出现错误 xff0c 如下 xff1a ZooKeeper JMX enable
  • MySql优化-count(*)和count(列)哪一个更加快

    MySql优化 count 和count 列 哪一个更加快 1 count 列 count 列 的速度是看列的偏移量来决定的 xff0c 理论上 xff0c 越靠前的列速度越快 xff0c 越靠后的列素的越慢 2 count count 的
  • 测试-Mockito的使用

    一 Mockito简述 Mockito的工作原理是通过创建依赖对象的proxy xff0c 所有的调用先经过proxy对象 xff0c proxy对象拦截了所有的请求再根据预设的返回值进行处理 Mockito包依赖 xff1a lt dep
  • Vue+SpringBoot使用注解@CrossOrigin解决跨域问题

    背景 xff1a 前台vue使用本地8082端口 xff0c 后台使用8080端口 xff0c 这样前台访问后台时候就产生了跨域问题 这里是从后台解决跨域问题 span class token annotation punctuation
  • vmware虚拟机和centos连接不上

    1 VM网络设置 点击NAT设置 记住网关和子网ip xff0c 后面会用 2 CentOs网络设置 root 64 localhost download cd etc sysconfig network scripts root 64 l
  • 关于异步,同步,阻塞,非阻塞的理解(转载)

    常规的误区 假设有一个展示用户详情的需求 xff0c 分两步 xff0c 先调用一个HTTP接口拿到详情数据 xff0c 然后使用适合的视图展示详情数据 如果网速很慢 xff0c 代码发起一个HTTP请求后 xff0c 就卡住不动了 xff
  • 程序员的期望与现实

    来自 xff1a 程序员最幽默 xff08 ID xff1a humor1024 xff09 0 我期望的代码 VS 实际代码的工作方式 1 我认为我的代码 VS 项目经理看到的代码 2 我心里想做的架构 VS 我真正写出来的架构 3 开发
  • linux后台执行命令:&和nohup

    当我们在终端或控制台工作时 xff0c 可能不希望由于运行一个作业而占住了屏幕 xff0c 因为可能还有更重要的事情要做 xff0c 比如阅读电子邮件 对于密集访问磁盘的进程 xff0c 我们更希望它能够在每天的非负荷高峰时间段运行 例如凌
  • Java进阶书籍推荐

    学习Java xff0c 书籍是必不可少的学习工具之一 xff0c 尤其是对于自学者而言 废话不多说 xff0c 下边就给大家推荐一些Java进阶的好书 第一部分 xff1a Java语言篇 1 Java编程规范 适合对象 xff1a 初级
  • Linux开机关机执行脚本方法

    1 在 etc rc d init d 下创建脚本 xff0c 要遵守service script的标准 xff1b 例如 xff1a vi etc rc d init d gfs bin bash case 34 1 34 in rest

随机推荐

  • Ubuntu 出现apt-get: Package has no installation candidate问题

    今天在安装软件的时候出现了Package has no installation candidate的问题 xff0c 如 xff1a apt get install lt packagename gt Reading package li
  • 深度学习(2):DenseNet与图片文字识别

    目的 xff1a 基于深度学习算法DenseNet对图片进行文字识别 xff0c 即OCR转换为文字 xff0c 并将图片进行可视化输出 一 DenseNet算法 DenseNet的基本思路与ResNet一致 xff0c 但是它建立的是前面
  • 安装配置vscode

    远程Linux服务器越来越慢 换成vscode开发好了 xff0c 费时操作放在后台运行 xff0c 不影响前端界面 安装VSCode Visual Studio Code 离线安装扩展 先在 Extensions for Visual S
  • Postman传入date类型

    字符串输入格式 xff1a 2021 08 01 00 00 00 Date输入格式 xff1a 2019 09 09 11 20 20 插入到数据库中是DATE类型 xff1a 先获取到参数转为String类型 xff0c 在格式化为Da
  • 《Activity显示界面历险记》—说说View的那些理不清的关系

    前言 在Activity显示View的过程中 xff0c 有一些重要的角色总让人理不清 xff0c 比如PhoneWindow DecorView ViewRootImpl 也常常有面试题会问到 xff0c 他们四者之间的关系 xff1f
  • smartBi数据源连接与业务主题及七大数据集及透视分析与仪表盘四大分析展示经验总结

    smartBi经验总结 数据门户 电脑主题的资源发布后 xff0c 发布的资源可以在数据门户中看到 xff0c 数据门户界面包含 xff1a 首页 xff0c 报表展示目录 xff0c 报表展示明细资源 首页的设置在系统运维中 系统选项 公
  • java 中 Color类

    Color类 Color类是用来封装颜色的 xff0c 在上面的例子中多次用到 使用Color对象较为简单的方法是直接使用Color类提供的预定义的颜色 xff0c 像红色Color red 橙色Color orange等 xff1b 也可
  • C语言位运算符:与、或、异或、取反、左移和右移

    语言位运算符 xff1a 与 或 异或 取反 左移和右移 位运算是指按二进制进行的运算 在系统软件中 xff0c 常常需要处理二进制位的问题 C语言提供了6个位操作运算符 这些运算符只能用于整型操作数 xff0c 即只能用于带符号或无符号的
  • android 打开蓝牙设备 显示已经配对的蓝牙设备 ,并将已配对的蓝牙设备显示在textview中

    xff08 1 xff09 要想使用android 手机的Bluetooth xff0c 需要在androidmanifest文件中加入使用蓝牙的权限 lt uses permission android name 61 34 androi
  • iOS 7 点击按钮切换视图

    xff08 1 xff09 创建一个项目 xff0c 名字为切换视图 xff08 2 xff09 打开Main storyboard文件 xff0c 将视图中的ViewController视图控制器拖动到画布中 xff08 3 xff09
  • Javaweb 入门测试程序(jsp)

    关于进行jsp程序开发的入门测试小程序 xff08 1 xff09 必须的工具软件 java开发工具包jdk 需要进行环境变量的设置 xff0c 有Java开发基础的人这一步一看就懂 xff01 xff08 2 xff09 安装MyEcli
  • 自媒体平台运营的感悟

    1 关键是自媒体平台的定位 西游记中唐僧有着坚定的志向 西天取经 xff0c 普渡众生 抱着这样的初心和宗旨 xff0c 打造了自己的取经团队 一路上历经九九八十一难 xff0c 初心不改 xff0c 终于到达西天 xff0c 取得真经 x
  • 排序方法总结(1)冒泡排序 选择排序

    排序方法是一种基本的 重要的算法 xff0c 排序的方法有很多 xff0c 现把一些基本排序方法的算法和c 代码列出如下 xff0c 供大家思考 xff0c 借鉴 xff0c 进步 在进行排序之前首先要做的一件事就是选择排序的准则 xff0
  • 排序方法总结(2)插入排序

    插入排序 插入排序类和大家玩的纸牌游戏有些类似 xff0c 在发牌的过程的过程中用右手起的牌 xff0c 总是和左手里的排进行比较 xff0c 然后放在恰当的位置 这就是插入排序的思想 以数组为例 xff0c 其算法是 xff1a xff0
  • 关闭IDEA保存后自动添加空格

    IDEA保存后会给每行自动添加空格 xff0c 关闭这个功能
  • 排序方法总结(3)希尔排序

    希尔排序 希尔排序是对插入排序的改进 xff0c 对中等规模的数据排序效率较高 xff01 交换的次数变得少了 xff0c 效率就高了 希尔排序的算法 1 相距为 k 的数据进行比较 xff0c 若不符合排序的条件 xff0c 就进行交换
  • 求阶乘的几种方法

    求阶乘的几种方法 xff08 1 xff09 常规求阶乘 利用循环即可求出 include lt stdio h gt int main int m n i sum 61 1 printf 34 please input one numbe
  • C++sort函数的用法

    C 43 43 sort 函数的用法 近来看了c 43 43 标准库这本书 xff0c 学到了很多 xff0c 就把这其中的一点 C 43 43 sort 函数的用法写下来和大家分享吧 xff01 xff08 一 xff09 为什么要用c
  • Design Patterns Elements of Reusable Object-Oriented Software(一)Introduction(介绍)

    1 Introduction xff08 介绍 xff09 Designing object oriented software is hard and designing reusable object oriented software
  • 排序方法之堆排序

    堆排序的实现 xff08 xff09 创建初始堆 xff08 二 xff09 堆排序 在创建初始堆之前首先要了解一些关于堆的概念 xff0c 还需要了解一些关于平衡二叉树的内容 xff08 1 xff09 堆的节点数 61 n 2 并且是只