堆排序(Java)

Posted 梁公子的备忘录

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了堆排序(Java)相关的知识,希望对你有一定的参考价值。

本文延续前述《经典排序算法》的代码,在其基础上介绍一种新的排序算法——堆排序(heapsort),与归并排序一样,但不同于插入排序的是,堆排序的时间复杂度是O(nlogn)。而与插入排序相同,但不同于归并排序的是,,堆排序同样具有空间原址性:任何时候都只需要常数个额外的元素空间存储临时数据。因此,堆排序是集合了归并排序和插入排序优点的排序算法。

    本程序使用Java™ SE Runtime Environment (build 12.0.2+10),编译器使用IntelliJ IDEA。本程序包含两个程序文件:HeapSort.java实现了堆排序的算法,HeapSortTest.java对其进行了测试。其中,HeapSort.java源码如下:

import java.util.Arrays;
public class HeapSort { HeapSort(int[] array) { heapSort(array); }
public void heapSort(int[] array){ //建堆(最大堆) //array.length/2-1是完全二叉树最后一个非叶子节点的编号 for(int i = array.length/2-1;i>=0;i--) { maxHeap(array,i,array.length-1); System.out.println(Arrays.toString(array)); } //交换最大元素和参与排序的最小元素的位置 for(int i = array.length-1;i>0;i--) { exchange(array,0,i); maxHeap(array,0,i-1); System.out.println(Arrays.toString(array)); } }
private void maxHeap(int[] array,int start,int end){ //完全二叉树中,父节点为N,左子节点为2N+1,右子节点为2N+2 int parentNode = start; int childNode = 2*parentNode+1; while(childNode<=end) { if(childNode+1<=end && array[childNode]<=array[childNode+1]) { childNode++; } if(array[parentNode]<=array[childNode]) { exchange(array,parentNode,childNode); parentNode = childNode; childNode = 2*parentNode+1; } else { return; } } }
private void exchange(int[] array,int i,int j){ int temp = array[i]; array[i] = array[j]; array[j] = temp; }}

HeapSortTest.java源码如下:

public class HeapSortTest { public static void main(String[] args) { int[] a = {1,2,5,3,7,6,4}; HeapSort testHeapSort = new HeapSort(a); }}

运行结果如下:

/Library/Java/JavaVirtualMachines/jdk-12.0.2.jdk/Contents/Home/bin/java "-javaagent:/Applications/IntelliJ IDEA.app/Contents/lib/idea_rt.jar=53246:/Applications/IntelliJ IDEA.app/Contents/bin" -Dfile.encoding=UTF-8 -classpath /Users/liangqian/IdeaProjects/堆排序/out/production/堆排序 HeapSortTest[1, 2, 6, 3, 7, 5, 4][1, 7, 6, 3, 2, 5, 4][7, 3, 6, 1, 2, 5, 4][6, 3, 5, 1, 2, 4, 7][5, 3, 4, 1, 2, 6, 7][4, 3, 2, 1, 5, 6, 7][3, 1, 2, 4, 5, 6, 7][2, 1, 3, 4, 5, 6, 7][1, 2, 3, 4, 5, 6, 7]
Process finished with exit code 0


以上是关于堆排序(Java)的主要内容,如果未能解决你的问题,请参考以下文章

算法-java代码实现堆排序

Java实现常见排序--希尔排序快排序堆排序归并排序等Java实现代码

堆排序Java实现

堆排序及手写堆的基本操作java代码

堆排序(Java)

Java堆排序