public class HeapSort {
/**
* 堆排序
* i的左右节点为2*i+1,2*i+2
* for(int i=n-1;i>=0;i--){
* for(int j=i%2==0?(i-2)/2:i/2;j>=0;j--){
*
* }
* }
*
*/
public static void main(String[] args){
int[]nums=new int[]{6,9,1,4,5,8,7,0,2,3,11,42,4,124,641,41,523,51235};
HeapSort_test(nums);
System.out.println(Arrays.toString(nums));
Arrays.sort(nums);
System.out.println(Arrays.toString(nums));
}
public static void HeapSort_test(int nums[]){
int n=nums.length;
for(int i=n-1;i>=0;i--){
for(int j=i%2==0?(i-2)/2:i/2;j>=0;j--){
int left=2*j+1,right=2*j+2;
if(left<=i&&nums[j]<nums[left]){
int temp=nums[j];
nums[j]=nums[left];
nums[left]=temp;
}
if(right<=i&&nums[j]<nums[right]){
int temp=nums[j];
nums[j]=nums[right];
nums[right]=temp;
}
}
int temp=nums[0];
nums[0]=nums[i];
nums[i]=temp;
}
}
}
以大顶堆为例,每一次堆调整后,堆顶会得到当前的最大值,将该最大值与数组末尾进行交换。此时有序区+1,无序区-1,无序区继续进行堆调整,然后得到最大值(全数组第二大值)放置到数组末尾。