import java.util.Arrays;
//大顶堆的构造
public class heap {
public static void main(String[] args){
int[] nums = new int[]{6,5,8,2,6,23,541,61,84,0,5,81,3,8,1,23};
int n=nums.length;
buildHeap(nums);
//System.out.println(Arrays.toString(nums));
//排序过程
for(int i=n-1 ; i>=1 ; --i){
swap(nums, 0, i);//交换堆顶和堆底元素,实现升序
adjustHeap(nums, 0, i);
}
//swap(nums, 0, 1); //最后两个元素交换了之后再建立堆,会导致大的又变成第一个,所以最后剩下的两个直接交换即可
System.out.println(Arrays.toString(nums));
}
public static void buildHeap(int[] nums){
int n = nums.length;
for(int i=(n-2)/2 ; i>=0 ; --i){ //自底下向上,自右边至左边建立堆
adjustHeap(nums, i, n);
}
}
public static void adjustHeap(int[] nums, int k, int end){
int temp = nums[k]; //只是一直追踪调整该元素的位置
for(int i=2*k+1 ; i<end ; i=2*k+1){ //自顶向下调整堆
//System.out.println(k);
if(i+1<end && nums[i+1]>nums[i]){
i+=1;//较大的那个是右孩子
}
if(nums[i]<=temp){
break; //不需要调整了
}else{
nums[k] = nums[i];
nums[i]=temp;
k=i;//调整改编为之后的孩子子树
}
//System.out.println(Arrays.toString(nums));
}
}
public static void swap(int[] nums, int i, int j){
int temp=nums[i];
nums[i]=nums[j];
nums[j]=temp;
}
}
JAVA建立大根堆以及排序
最新推荐文章于 2024-03-20 19:55:35 发布