算法导论Java实现-堆排序(6.4章节)

简介:


  
  
  1. package lhz.algorithm.chapter.six; 
  2. /** 
  3.  * “堆排序”,《算法导论》6.4章节 
  4.  * 利用之前实现的构建MaxHeap和MaxHeapify算法完成排序。 
  5.  * 伪代码: 
  6.  * HEAPSORT(A) 
  7.  * 1 BUILD-MAX-HEAP(A) 
  8.  * 2 for i ← length[A] downto 2 
  9.  * 3 do exchange A[1] ↔ A[i] 
  10.  * 4 heap-size[A] ← heap-size[A] - 1 
  11.  * 5 MAX-HEAPIFY(A, 1) 
  12.  * @author lihzh(苦逼coder) * 本文地址:http://mushiqianmeng.blog.51cto.com/3970029/738164  */ 
  13. public class HeapSort { 
  14.      
  15.     private static int[] input = new int[] {1614108793241}; 
  16.  
  17.     public static void main(String[] args) { 
  18.         //堆排序 
  19.         heapSort(); 
  20.         //打印数组 
  21.         printArray(); 
  22.     } 
  23.      
  24.     /** 
  25.      * 堆排序,《算法导论》原文摘要: 
  26.      * The heapsort algorithm starts by using BUILD-MAX-HEAP to build a max-heap on the input 
  27.      * array A[1  n], where n = length[A]. Since the maximum element of the array is stored at the 
  28.      * root A[1], it can be put into its correct final position by exchanging it with A[n].  
  29.      * If we now "discard" node n from the heap (by decrementing heap-size[A]), we observe that  
  30.      * A[1  (n -1)] can easily be made into a max-heap. The children of the root remain max-heaps,  
  31.      * but the new root element may violate the max-heap property. All that is needed to restore  
  32.      * the maxheap property, however, is one call to MAX-HEAPIFY(A, 1), which leaves a max-heap  
  33.      * in A[1 (n - 1)]. The heapsort algorithm then repeats this process for the max-heap of size  
  34.      * n - 1 down to a heap of size 2. 
  35.      * 复杂度: 
  36.      * 由之前分析可知,buildMaxHeap复杂度为O(n lg n),运行一次。 
  37.      * maxHeapify的复杂度为O(lg n),运行n-1次。 
  38.      * 综上,复杂度为O(n lg n)。 
  39.      */ 
  40.     private static void heapSort() { 
  41.         int length = input.length; 
  42.         //构造max-heap 
  43.         buildMaxHeap(input, length);//交换位置 
  44.         for (int i = length - 1; i > 0; i--) { 
  45.             int temp = input[i]; 
  46.             input[i] = input[0]; 
  47.             input[0] = temp; 
  48.             maxHeapify(input, 1, i); 
  49.         } 
  50.     } 
  51.  
  52.     private static void buildMaxHeap(int[] array, int heapSize) { 
  53.         for (int i = heapSize / 2; i > 0; i--) { 
  54.             maxHeapify(array, i, heapSize); 
  55.         } 
  56.     } 
  57.      
  58.     private static void maxHeapify(int[] array, int index, int heapSize) { 
  59.         int l = index * 2
  60.         int r = l + 1
  61.         int largest; 
  62.         //如果左叶子节点索引小于堆大小,比较当前值和左叶子节点的值,取值大的索引值 
  63.         if (l <= heapSize && array[l-1] > array[index-1]) { 
  64.             largest = l; 
  65.         } else { 
  66.             largest = index; 
  67.         } 
  68.         //如果右叶子节点索引小于堆大小,比较右叶子节点和之前比较得出的较大值,取大的索引值 
  69.         if (r <= heapSize && array[r-1] > array[largest-1]) { 
  70.             largest = r; 
  71.         } 
  72.         //交换位置,并继续递归调用该方法调整位置。 
  73.         if (largest != index) { 
  74.             int temp = array[index-1]; 
  75.             array[index-1] = array[largest-1]; 
  76.             array[largest-1] = temp; 
  77.             maxHeapify(array, largest, heapSize); 
  78.         } 
  79.     } 
  80.      
  81.     private static void printArray() { 
  82.         for (int i : input) { 
  83.             System.out.print(i + " "); 
  84.         } 
  85.     } 

 

 



     本文转自mushiqianmeng 51CTO博客,原文链接:http://blog.51cto.com/mushiqianmeng/738164,如需转载请自行联系原作者




相关文章
|
2月前
|
存储 算法 安全
探究‘公司禁用 U 盘’背后的哈希表算法与 Java 实现
在数字化办公时代,信息安全至关重要。许多公司采取“禁用U盘”策略,利用哈希表算法高效管理外接设备的接入权限。哈希表通过哈希函数将设备标识映射到数组索引,快速判断U盘是否授权。例如,公司预先将允许的U盘标识存入哈希表,新设备接入时迅速验证,未授权则禁止传输并报警。这有效防止恶意软件和数据泄露,保障企业信息安全。 代码示例展示了如何用Java实现简单的哈希表,模拟公司U盘管控场景。哈希表不仅用于设备管理,还在文件索引、用户权限等多方面助力信息安全防线的构建,为企业数字化进程保驾护航。
|
2天前
|
存储 搜索推荐 算法
算法系列之排序算法-堆排序
堆排序(Heap Sort)是一种基于堆数据结构的比较排序算法。它的时间复杂度为 $O(nlogn)$,并且是一种原地排序算法(即不需要额外的存储空间)。堆排序的核心思想是利用堆的性质来维护一个最大堆或最小堆,然后逐步将堆顶元素(最大值或最小值)取出,放到数组的末尾,最终得到一个有序的数组。
20 8
算法系列之排序算法-堆排序
|
5月前
|
存储 人工智能 算法
数据结构与算法细节篇之最短路径问题:Dijkstra和Floyd算法详细描述,java语言实现。
这篇文章详细介绍了Dijkstra和Floyd算法,这两种算法分别用于解决单源和多源最短路径问题,并且提供了Java语言的实现代码。
132 3
数据结构与算法细节篇之最短路径问题:Dijkstra和Floyd算法详细描述,java语言实现。
|
5月前
|
算法 搜索推荐
数据结构与算法学习十八:堆排序
这篇文章介绍了堆排序是一种通过构建堆数据结构来实现的高效排序算法,具有平均和最坏时间复杂度为O(nlogn)的特点。
109 0
数据结构与算法学习十八:堆排序
|
5月前
|
算法 Java 数据中心
探讨面试常见问题雪花算法、时钟回拨问题,java中优雅的实现方式
【10月更文挑战第2天】在大数据量系统中,分布式ID生成是一个关键问题。为了保证在分布式环境下生成的ID唯一、有序且高效,业界提出了多种解决方案,其中雪花算法(Snowflake Algorithm)是一种广泛应用的分布式ID生成算法。本文将详细介绍雪花算法的原理、实现及其处理时钟回拨问题的方法,并提供Java代码示例。
176 2
|
5月前
|
算法 搜索推荐
算法之堆排序
本文介绍了堆排序算法的原理和实现,通过构建最大堆或最小堆,利用堆的性质进行高效的排序,并提供了具体的编程实现细节和示例。
52 0
算法之堆排序
|
5月前
|
算法 Java Go
深入了解堆排序算法
深入了解堆排序算法
74 1
|
7月前
|
搜索推荐 算法 Java
堆排序实战:轻松实现高效排序,附详细Java代码
嗨,大家好!我是小米,一名热爱技术分享的程序员。今天要带大家了解堆排序——一种基于二叉堆的数据结构,具有O(n log n)时间复杂度的选择排序算法。堆排序分为构建大顶堆和排序两个阶段:先建堆使根节点为最大值,再通过交换根节点与末尾节点并调整堆来逐步排序。它稳定高效,空间复杂度仅O(1),适合对稳定性要求高的场合。虽然不如快速排序快,但在避免递归和节省空间方面有优势。一起动手实现吧!如果有任何疑问,欢迎留言交流!
122 2
|
7月前
|
算法 Java
LeetCode经典算法题:矩阵中省份数量经典题目+三角形最大周长java多种解法详解
LeetCode经典算法题:矩阵中省份数量经典题目+三角形最大周长java多种解法详解
87 6
|
7月前
|
搜索推荐 算法 Java

热门文章

最新文章