数据结构与算法分析(Java语言描述)(13)—— 原地堆排序
来源:互联网 发布:树莓派3b 网络配置 编辑:程序博客网 时间:2024/06/05 05:25
package com.algorithm.sort;public class HeapSortInPlace { private HeapSortInPlace() { } public static void sort(Integer[] arr) { int n = arr.length; // 注意:我们堆的索引是从0开始的 // 从(最后一个元素的索引-1)/2 开始 // 最后一个元素的索引为 n-1 // 将数组原地 shiftDown 变为 最大堆 for (int i = (n - 1 - 1) / 2; i >= 0; i--) { shiftDown(arr, n, i); } // 交换数组的第一个元素(最大元素)与数组末尾的元素(i) // 使整个数组从后向前依次有序 // 对剩余的数组进行 shiftDown 操作,使其变为 最大堆 for (int i = n - 1; i > 0; i--) { SortTestHelper.swap(arr, 0, i); shiftDown(arr, i, 0); } } private static void shiftDown(Integer[] arr, int n, int k) { // 当存在 左子节点 时 while (2 * k + 1 < n) { // j 为 左子节点 int j = 2 * k + 1; // 右子节点(j+1)存在,且 右子节点 > 左子节点 if (j + 1 < n && arr[j + 1].compareTo(arr[j]) > 0) { // j 移动到 右子节点处 j++; } // 父节点(k) > 子节点中较大者, break if (arr[k].compareTo(arr[j]) >= 0) break; // 父节点(k) 与 子节点中较大者进行交换 SortTestHelper.swap(arr, j, k); // k 移动到 子节点中 较大者 的位置(j) k = j; } } public static void main(String[] args) { int N = 100000; Integer[] arr = SortTestHelper.generateRandomArray(N, 0, 100000); System.out.println("排序前的数组为:"); SortTestHelper.printArray(arr); Long start = System.currentTimeMillis(); HeapSortInPlace.sort(arr); Long end = System.currentTimeMillis(); System.out.println("-------------------------------------------"); System.out.println("排序后的数组为:"); SortTestHelper.printArray(arr); System.out.println("-------------------------------------------"); System.out.println("排序后的数组是否有序:"); if (SortTestHelper.isSorted(arr)) { System.out.println("数组有序~"); } else { System.out.println("数组无序!"); } System.out.println("-------------------------------------------"); System.out.println("排序算法的运行时间为" + " : " + (end - start) + "ms"); }}
阅读全文
0 0
- 数据结构与算法分析(Java语言描述)(13)—— 原地堆排序
- 数据结构与算法分析(Java语言描述)(12)—— 堆排序与数组建堆
- 数据结构与算法分析(Java语言描述)(14)—— 索引堆
- 数据结构与算法分析(Java语言描述)(8)—— (随机)快速排序
- 数据结构与算法分析(Java语言描述)(9)—— (双轴)快速排序
- 数据结构与算法分析(Java语言描述)(1)—— 选择排序
- 数据结构与算法分析(Java语言描述)(2)—— 插入排序
- 数据结构与算法分析(Java语言描述)(3)—— 冒泡排序
- 数据结构与算法分析(Java语言描述)(4)—— 希尔排序
- 数据结构与算法分析(Java语言描述)(5)—— 归并排序
- 数据结构与算法分析(Java语言描述)(7)—— 快速排序
- 排序算法——堆排序(java语言描述)
- 数据结构与算法分析(Java语言描述)(11)—— 二叉堆(Binary Heap)
- 《算法与数据结构》学习笔记 4-6 优化的堆排序(原地堆排序)
- 数据结构与算法分析(Java语言描述)(6)—— 归并排序(自底向上)
- 数据结构与算法分析(Java语言描述)(10)—— (三向切分)快速排序
- 读书笔记:数据结构与算法分析(Java语言描述)——数据结构概论
- 数据结构与算法分析——Java语言描述
- ThinkPHP下的RBAC权限访问理解【笔记】
- 吴恩达【深度学习工程师】学习笔记(七)
- php运行报错Call to undefined function curl_init()
- oracle修改序列从指定值开始递增
- jquery获取ajax成功请求的返回值,并返回给其他函数使用
- 数据结构与算法分析(Java语言描述)(13)—— 原地堆排序
- LTE物理传输资源(2)-频带、信道带宽和频点号EARFCN
- Java_MySwap
- Html5新标签解释及用法(转载)
- Failed to resolve: com.android.support:appcompat-v7:27.+
- java窗体---加入购物车
- 【推荐】PHP-集成函数总结
- osgEarth多文件读取 12.gdal_multiple_files.earth
- GD库函数学习【笔记】