堆排序只需要理解三点: 1:数组转化为完全二叉树,其中根节点与子节点之间的是有固定的简单关系的。从0开始就是 i -> 2i+1 2i+2 2:将二叉树开始为无序的,需要交换节点数据转化为堆,也就是无论哪个位置的根节点为最大值(大顶堆),期间发生交换,子树结构发生变化,需要重新比较转化最大堆。 3。转化为最大堆得后,当前数组下标最大的与顶堆交换,下一轮最大下标的位置不参与构建大顶堆。 循环调用上面的2.3步骤:
参考:https://baike.baidu.com/item/%E5%A0%86%E6%8E%92%E5%BA%8F/2840151?fr=aladdin 图形化数展示转化过程:https://www.cs.usfca.edu/~galles/visualization/HeapSort.html
package com.lixiaowu.property.test.tree;
import javafx.scene.chart.XYChart;
import java.util.Arrays;
import java.util.Date;
public class HeapSortTest {
public static void main(String []args){
Date dateq = new Date();
long time = dateq.getTime();
int []arr = {9,8,7,6,5,4,3,2,6,65,4,234,234,42,4,24,24,2,5,3,5,5,25};
sort(arr);
System.out.println(Arrays.toString(arr));
Date dateq2 = new Date();
long time2 = dateq2.getTime();
System.out.println(time2 - time);
}
public static void sort(int []arr){
for(int i=arr.length/2-1;i>=0;i--){
adjustHeap(arr,i,arr.length);
}
for(int j=arr.length-1;j>0;j--){
swap(arr,0,j);
adjustHeap(arr,0,j);
}
}
public static void adjustHeap(int []arr,int i,int length){
int temp = arr[i];
for(int k=i*2+1;k<length;k=k*2+1){
if(k+1<length && arr[k]<arr[k+1]){
k++;
}
if(arr[k] >temp){
arr[i] = arr[k];
i = k;
}else{
break;
}
}
arr[i] = temp;
}
public static void swap(int []arr,int a ,int b){
int temp=arr[a];
arr[a] = arr[b];
arr[b] = temp;
}
}
|