算法解析参考:https://www.jianshu.com/p/a161b991fa82
java实现:
public class 堆排序 {
public static void main(String[] args) {
int[] array = {4,6,8,5,9};
for(int i=0; i<array.length-1; i++) {
System.out.println("--------第"+i+"次排序过程----------");
creatHeap(array, array.length-1-i);
swap(array, 0, array.length-1-i);
for(int val:array) {
System.out.print(val+"->");
}
System.out.println();
}
}
// 创建堆结构
public static void creatHeap(int[] arr, int lastIndex) {
for(int i=arr.length/2-1; i>=0; i--) {
int t=i;
// 交换最大的值作为父节点
while(t<=arr.length/2-1) {
// 左子节点
int bigIndex = 2*t+1;
if(bigIndex<lastIndex) {
if(arr[bigIndex]<arr[bigIndex+1]) {
bigIndex++;
}
}
if(bigIndex<=lastIndex) {
if(arr[bigIndex]>arr[t]) {
swap(arr, t, bigIndex);
}
}
t++;
//打印出交换后的堆结构
for(int val:arr) {
System.out.print(val+"->");
}
System.out.println();
}
}
}
public static void swap(int[] arr, int i, int j) {
int temp = arr[i];
arr[i] =arr[j];
arr[j] = temp;
}
运行结果:
--------第0次排序过程----------
4->9->8->5->6->
9->4->8->5->6->
9->6->8->5->4->
4->6->8->5->9->
--------第1次排序过程----------
4->6->8->5->9->
8->6->4->5->9->
8->6->4->5->9->
5->6->4->8->9->
--------第2次排序过程----------
5->6->4->8->9->
6->5->4->8->9->
6->5->4->8->9->
4->5->6->8->9->
--------第3次排序过程----------
4->5->6->8->9->
5->4->6->8->9->
5->4->6->8->9->
4->5->6->8->9->