优化堆排序 女爷i 2024-03-16 20:54 41阅读 0赞 上一节的堆排序,我们开辟了额外的空间进行构造堆和对堆进行排序。这一小节,我们进行优化,使用原地堆排序。 对于一个最大堆,首先将开始位置数据和数组末尾数值进行交换,那么数组末尾就是最大元素,然后再对W元素进行 shift down 操作,重新生成最大堆,然后将新生成的最大数和整个数组倒数第二位置进行交换,此时到处第二位置就是倒数第二大数据,这个过程以此类推。 整个过程可以用如下图表示: ![87c1ff019484c7cbc46ea7b0f3891cd8.png][] #### Java 实例代码 #### ### src/runoob/heap/HeapSort.java 文件代码: ### > package runoob.heap; > > import runoob.sort.SortTestHelper; > > /\*\* > \* 原地堆排序 > \*/ > public class HeapSort<T extends Comparable> \{ > > > public static void sort(Comparable\[\] arr) \{ > > int n = arr.length; > > // 注意,此时我们的堆是从0开始索引的 > // 从(最后一个元素的索引-1)/2开始 > // 最后一个元素的索引 = n-1 > for (int i = (n - 1 - 1) / 2; i >= 0; i--) > shiftDown(arr, n, i); > > for (int i = n - 1; i > 0; i--) \{ > swap(arr, 0, i); > shiftDown(arr, i, 0); > \} > \} > > // 交换堆中索引为i和j的两个元素 > private static void swap(Object\[\] arr, int i, int j) \{ > Object t = arr\[i\]; > arr\[i\] = arr\[j\]; > arr\[j\] = t; > \} > > // 原始的shiftDown过程 > private static void shiftDown(Comparable\[\] arr, int n, int k) \{ > > while (2 \* k + 1 < n) \{ > //左孩子节点 > int j = 2 \* k + 1; > //右孩子节点比左孩子节点大 > if (j + 1 < n && arr\[j + 1\].compareTo(arr\[j\]) > 0) > j += 1; > //比两孩子节点都大 > if (arr\[k\].compareTo(arr\[j\]) >= 0) break; > //交换原节点和孩子节点的值 > swap(arr, k, j); > k = j; > \} > \} > > // 测试 HeapSort > public static void main(String\[\] args) \{ > > int N = 100; > Integer\[\] arr = SortTestHelper.generateRandomArray(N, 0, 100000); > sort(arr); > // 将heapify中的数据逐渐使用extractMax取出来 > // 取出来的顺序应该是按照从大到小的顺序取出来的 > for (int i = 0; i < N; i++) \{ > System.out.print(arr\[i\] + " "); > \} > // 确保arr数组是从大到小排列的 > for (int i = 1; i < N; i++) > assert arr\[i - 1\] >= arr\[i\]; > \} > \} [87c1ff019484c7cbc46ea7b0f3891cd8.png]: https://image.dandelioncloud.cn/pgy_files/images/2024/03/15/2c899e4b0da24198af66f69b15992dbd.png
相关 优化堆排序 上一节的堆排序,我们开辟了额外的空间进行构造堆和对堆进行排序。这一小节,我们进行优化,使用原地堆排序。 对于一个最大堆,首先将开始位置数据和数组末尾数值进行交换,那么数组末尾 女爷i/ 2024年03月16日 20:54/ 0 赞/ 42 阅读
相关 优化堆排序(Java 实例代码) 目录 优化堆排序 Java 实例代码 src/runoob/heap/HeapSort.java 文件代码: -------------------- 优化堆排序 桃扇骨/ 2023年10月14日 15:52/ 0 赞/ 40 阅读
相关 排序-堆排序 1.堆排序前言 前面博客中讲到简单选择排序,它在待排序的n个记录中选择一个最小的记录需要比较n-1次。本来这也可以理解,查找第一个数据需要比较这么多次是正常的,否则如何知 旧城等待,/ 2022年09月30日 06:45/ 0 赞/ 228 阅读
相关 【排序】堆排序 堆的定义 设有n个元素的序列 k1,k2,…,kn,当且仅当满足下述关系之一时,称之为堆。 ![图示][SouthEast] 解释:如果让满足以上条件的元素序列 (k 分手后的思念是犯贱/ 2022年06月18日 11:47/ 0 赞/ 264 阅读
相关 看懂堆排序——堆与堆排序(三) 看懂堆排序——堆与堆排序(三) 看懂堆排序——堆与堆排序(三) 堆排序的基本思想 代码详解 偏执的太偏执、/ 2022年05月25日 06:52/ 0 赞/ 281 阅读
相关 排序——堆排序 堆排序代码 include <iostream> using namespace std; include <stdio.h> in 墨蓝/ 2022年05月21日 12:05/ 0 赞/ 255 阅读
相关 堆排序 什么是堆排序,堆排序能解决什么问题? 在排序的过程中,不能把进行排序的过程中,得一些信息保留下来吗?来加快排序的速度吗?答案是可以的。通过利用完全二叉堆的结构来保留信息。 迷南。/ 2021年10月29日 07:20/ 0 赞/ 363 阅读
相关 堆和堆排序 堆排序 堆排序基本介绍 1. 堆排序是利用堆这种数据结构而设计的一种排序算法,堆排序是一种选择排序,它的最坏,最好,平均时间复 杂度均为 O(nlogn),它也 柔光的暖阳◎/ 2021年10月19日 21:12/ 0 赞/ 396 阅读
相关 排序-堆排序 [2019独角兽企业重金招聘Python工程师标准>>> ][2019_Python_] ![hot3.png][] 在说明堆排序的过程前得先了解什么是堆: 先看下图(来源 清疚/ 2021年09月20日 03:22/ 0 赞/ 432 阅读
相关 堆排序 堆排序的特点是:在排序过程中,将待排序数组看成是一棵完全二叉树的顺序存储结构,利用完全二叉树中父结点和子结点之间的内在关系,在当前无序区中选择关键字最大(或最小) 不念不忘少年蓝@/ 2021年09月17日 00:16/ 0 赞/ 456 阅读
还没有评论,来说两句吧...