堆排序
顺序存储二叉树
1、找到每个节点的最大堆节点(每个节点都需要进行一次最大堆节点处理):注size=arr.length
public static void maxHeap(int [] arr,int size,int index){
//左子节点
int leftNode=2*index+1;
//右子节点
int righNode=2*index+2;
//标记最大值下标位置
int max=index;
//和两个子节点分别对比,找出最大的节点
if (leftNode<size && arr[leftNode]>arr[max]){
max=leftNode;
}
if (righNode<size && arr[righNode]>arr[max]){
max=righNode;
}
//交换位置
if (max!=index) {
int temp=arr[index];
arr[index]=arr[max];
arr[max]=temp;
}
}
2、实现最大堆二叉树
public static void main(String[] args) {
int[] arr = new int[]{8,2,1,9,5,7};
//获取节点个数
int start=(arr.length-1)/2;
//从最后一个节点开始处理堆:对每个节点上的左右节点进行处理
for (int i = start; i >= 0; i--) {
maxHeap(arr,arr.length,i);
}
System.out.println(Arrays.toString(arr));
}
结果:[9, 8, 7, 2, 5, 1]
3、进行最大堆排序:将处理完后的最大堆二叉树,从数组最后开始依次和下标0替换,并且替换后最后一个下标保持不被改变
public static void heapSort(int[] arr){
int start=(arr.length-1)/2;
//从最后一个节点开始处理堆:对每个节点上的左右节点进行处理
for (int i = start; i >= 0; i--) {
maxHeap(arr,arr.length,i);
}
//替换最后一个下标
for (int i = arr.length - 1; i > 0; i--) {
int temp=arr[0];
arr[0]=arr[i];
arr[i]=temp;
maxHeap(arr,i,0);
}
}
结果:[1, 2, 5, 7, 8, 9]