当前位置: 首页 > news >正文

(排序详解之 堆排序)

堆排序

 

本文将介绍一下堆排序的过程。

 

要点:(最小堆为例)

1.      调整堆函数:传入节点索引,对比当前节点与父节点大小,如果小于则交换位置,以父节点位置递归执行。

2.      index=Arr.Count/ 2 -1 ,取到index位置的子节点,将子节点和当前节点依次传入递归函数执行,i[0,index],i--循环执行

3.      每次移除根节点,执行1,2过程,直到数组中没有节点

 

详细过程:

 

还是以一个数组为开始:

5 , 1 ,9 ,3 ,7 ,4 ,8 ,6 ,2

 

我们开始建立堆(本文讨论二插堆),规则是这样的,从第一个元素开始,它的索引为I,那么2*i+12*i+2是它的后代

 

 

括号内为索引值:

 

 

 


堆建立好了,现在开始调整堆并排序。

第一步,从index= arr.Count/2 – 1 = 9/2-1 = 3开始,

 

 

 

 

 


                          

 


第二步,index = 2

 

 

 

 

 

 

 

 

 

 

 

 

 

 


第三步,index = 1

 

 

 

 

 

 

 

 

 

 

Index = 0 ,发现不用调整,第一轮执行完毕,因此移除第一项,对接下来的数组做同样的操作,在此就不一一演示了。

 

参考代码:

public List<int>HeapSort(List<int> arr)
        {
 
            var ret = new List<int>();
 
            while (arr.Count > 0)
            {
                for (int i = arr.Count / 2 - 1;i >= 0; i--)
                {
                    if (i > 0)
                        HeapMerge(arr, i);
 
                    HeapMerge(arr, i * 2 + 1);
 
                    if (i * 2 + 2 <=arr.Count - 1)
                       HeapMerge(arr, i * 2 +2);
 
                  
                }
    
                ret.Add(arr[0]);
                arr.RemoveAt(0);
            }
 
            return ret;
        }
 
        //construct heap
        private void HeapMerge(List<int>arr,int index)
        {
            if (index > 0 &&arr[index] < arr[(index-1)/2])
            {
                var tmp = arr[index];
                arr[index] = arr[(index-1)/2];
                arr[(index-1)/2] = tmp;
                HeapMerge(arr,(index-1)/2);
            }
        }


 

希望现在您已经很清楚二插堆和堆排序了。

感谢您的阅读。

相关文章:

  • 拿什么拯救你,我的9800GTX+——BIOS刷新失败拯救方案
  • 排序详解之归并排序
  • 排序详解之快速排序
  • 价差100元 性能相当 蓝宝HD4830白金版 PK 9800GT显卡
  • 软件周周侃
  • 新的威胁!智能手机将成为黑客的下一个目标
  • 无资无本如何赚钱?——当一名“淘客”走上网络打工之路
  • Asp.net Design Pattern study notes -- PART 2
  • 利用Excel巧制抽奖器
  • XnView调整图片不失真
  • 物尽其才 用PotPlayer免费转录高清电影
  • 一句话技巧
  • How to use Interface
  • 无需第三方软件 用ScreenToaster在线进行视频录制
  • 将你的收藏共享给QQ好友
  • 【挥舞JS】JS实现继承,封装一个extends方法
  • android 一些 utils
  • Angular 响应式表单 基础例子
  • echarts花样作死的坑
  • iOS筛选菜单、分段选择器、导航栏、悬浮窗、转场动画、启动视频等源码
  • Leetcode 27 Remove Element
  • swift基础之_对象 实例方法 对象方法。
  • vue+element后台管理系统,从后端获取路由表,并正常渲染
  • Xmanager 远程桌面 CentOS 7
  • 分享一个自己写的基于canvas的原生js图片爆炸插件
  • 聊聊spring cloud的LoadBalancerAutoConfiguration
  • 如何选择开源的机器学习框架?
  • 携程小程序初体验
  • 要让cordova项目适配iphoneX + ios11.4,总共要几步?三步
  • 因为阿里,他们成了“杭漂”
  • 云大使推广中的常见热门问题
  • 字符串匹配基础上
  • ## 临床数据 两两比较 加显著性boxplot加显著性
  • (C语言)strcpy与strcpy详解,与模拟实现
  • (附源码)springboot助农电商系统 毕业设计 081919
  • (附源码)ssm高校升本考试管理系统 毕业设计 201631
  • (四)搭建容器云管理平台笔记—安装ETCD(不使用证书)
  • (五) 一起学 Unix 环境高级编程 (APUE) 之 进程环境
  • (原創) 如何將struct塞進vector? (C/C++) (STL)
  • (原創) 如何讓IE7按第二次Ctrl + Tab時,回到原來的索引標籤? (Web) (IE) (OS) (Windows)...
  • (转)es进行聚合操作时提示Fielddata is disabled on text fields by default
  • (转)memcache、redis缓存
  • (转)Sql Server 保留几位小数的两种做法
  • (转载)Linux网络编程入门
  • .NET Framework 服务实现监控可观测性最佳实践
  • .NET Standard 支持的 .NET Framework 和 .NET Core
  • .Net(C#)自定义WinForm控件之小结篇
  • .NET/C# 使用 #if 和 Conditional 特性来按条件编译代码的不同原理和适用场景
  • .NET/C# 使用 ConditionalWeakTable 附加字段(CLR 版本的附加属性,也可用用来当作弱引用字典 WeakDictionary)
  • .NET/C# 项目如何优雅地设置条件编译符号?
  • .NET/C# 中你可以在代码中写多个 Main 函数,然后按需要随时切换
  • @vue/cli脚手架
  • [ IO.File ] FileSystemWatcher
  • [acwing周赛复盘] 第 94 场周赛20230311
  • [Android Studio] 开发Java 程序