package tree;
/*
* 2020/06/18 11:52
* author:user
*/
import java.util.Arrays;
public class HeapSort {
public static void main(String[] args) {
int arr[] = {4,6,8,-1,-100,5,9};
heapSort(arr);
}
public static void heapSort(int arr[]) {
int temp = 0;
System.out.println("堆排序!!");
//分步完成
// adjustHeap(arr,1,arr.length);
// System.out.println("第一次=" + Arrays.toString(arr)); //4,9,8,5,6
// adjustHeap(arr,0,arr.length);
// System.out.println("第二次=" + Arrays.toString(arr)); //9,6,8,5,4
//完成最终代码
//做成大顶堆
for(int i = arr.length/2-1;i>=0;i--) {
adjustHeap(arr,i,arr.length);
}
for(int j=arr.length-1;j>=0;j--) {
// 每次都和最后一个元素交换
temp = arr[j];
arr[j] = arr[0];
arr[0] = temp;
adjustHeap(arr,0,j); //真实调整从顶部开始
}
System.out.println("数组=" + Arrays.toString(arr)); //9,6,8,5,4
}
// 将一个数组(二叉树),调整成一个大顶堆
// 重要
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++; //k指向右子节点
}
if(arr[k]>temp) {
arr[i] = arr[k];
i = k; //i值会变
}else {
break;
}
}
//当for循环结束后,我们已经将以i为父节点的树的最大值,放在了最顶(局部)。
arr[i] = temp; //将tempt值放到调整后的位置。
}
}
自己整理的数据结构学习之堆排序代码整理
最新推荐文章于 2023-04-11 15:24:10 发布