堆排序(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
[ ]
[ ]
[ ]
[ ]
[ ]
[ ]
[ ]
[ ]
[ ]
Process finished with exit code 0
以上是关于堆排序(Java)的主要内容,如果未能解决你的问题,请参考以下文章