选择排序——堆排序
发布日期:2021-09-28 18:46:38
浏览次数:8
分类:技术文章
本文共 1179 字,大约阅读时间需要 3 分钟。
堆排序采用二叉树结构组合数据,有大顶堆和小顶堆两种。堆排序的原理就是通过叶子节点与父节点的对比挪位,将最小或最大值挪至树顶;再将其排出后重复该动作,因此分为两步:1.建堆 2.排除堆顶
二叉树父节点索引值:(k - 1) / 2 子节点索引值:2 * k + 1、2 * k + 2 |
package com.h3c.paixu;public class 堆排序Demo { public static void main(String[] args) { // 1. 初始化一个无序数组 int[] myArr = { 23, 35, 73, 27, 4, 77, 54, 84, 47, 56, 34, 32, 75, 32, 31, 0, 99, 7, 54, 57 }; for (int k = myArr.length - 1; k > 0; k--) { myArr = 堆排序(k, myArr); for (int i : myArr) { System.out.print(i + " "); } System.out.println(""); } } public static int[] 堆排序(int startIndex, int[] arr) { int 最后一个非叶子节点 = (startIndex - 1) / 2; // 二叉树父节点索引(len - 1)/2 for (int n = 最后一个非叶子节点; n >= 0; n--) { int 左儿子 = 2 * n + 1; int 右儿子 = 2 * n + 2; if (右儿子 < startIndex && arr[右儿子] > arr[n]) { int tempIndex = arr[右儿子]; arr[右儿子] = arr[n]; arr[n] = tempIndex; } if (arr[左儿子] > arr[n]) { int tempIndex = arr[左儿子]; arr[左儿子] = arr[n]; arr[n] = tempIndex; } } // 将本轮获取的最大值放在数组最后,下次循环尾标-1 int tempIndex = arr[0]; arr[0] = arr[startIndex]; arr[startIndex] = tempIndex; return arr; }}堆排序跟直接选择排序相比并不能减少遍历的次数,但是可以减少每次遍历对比元素的次数,因此略优于直接选择排序,但是其实现逻辑较为复杂,一般很少用到。
时间复杂度为:O(nlog2^n) ,空间复杂度为:O(1),堆排序是不稳定排序。
转载地址:https://blog.csdn.net/h3c4lenovo/article/details/8578035 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
留言是一种美德,欢迎回访!
[***.207.175.100]2024年04月09日 22时00分55秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
Android的.dex、.odex与.oat文件扫盲
2019-04-27
Unity移动应用如何在Bugly上查看崩溃堆栈
2019-04-27
unity3D 在屏幕边框创建碰撞框
2019-04-27
xml中常用的转义符
2019-04-27
关于MSDK的几个难点
2019-04-27
使用UnityEditor做工具
2019-04-27
Visual Studio我常用的快捷键
2019-04-27
写C# dll供Unity调用
2019-04-27
Linux制作run安装包
2019-04-27
一分钟学会C#解析XML
2019-04-27
unity AssetBundle的资源管理
2019-04-27
【转】Unity中HideInInspector和SerializeField一起使用
2019-04-27
单例模板类
2019-04-27
Unity与java相互调用
2019-04-27
android截屏代码
2019-04-27
unity NGUI图文混排
2019-04-27
Unity项目优化
2019-04-27
Unity3D Shader 入门
2019-04-27
MSDK手Q邀请透传参数问题:url编解码与base64编解码
2019-04-27