大根堆调整,具体看代码和注释。
public class HeadS {
public static void heapSort(int[] arr)//大根堆
{
if(arr==null||arr.length<2)
return;
for(int i=0;i<arr.length;i++)//把数组的每个元素插入堆中
{
heapInsert(arr,i);
}
}
public static void heapInsert(int[] arr,int j)
{
while(arr[j]>arr[(j-1)/2])//插入过程中,插入节点与父节点比较,大于父节点则换上去,并且循环遍历往上走。(0-1)/2==0
{
swap(arr, j, (j-1)/2);
j=(j-1)/2;
}
}
public static void heapify(int[] arr,int index,int heapSize)//当大根堆中的某个节点值变化时,调用该函数调整,只是向下遍历调整
{
int left=index*2+1;
while(left<heapSize)
{
int largest=left+1<heapSize&&arr[left+1]>arr[left]?left+1:left;//left是左节点,left+1是右节点
largest=arr[index]>arr[largest]?index:largest;
if(largest==index)
break;
swap(arr, index, largest);
index=largest;
left=largest*2+1;
}
}
public static void swap(int[] arr,int i,int j) {
int temp=arr[i];
arr[i]=arr[j];
arr[j]=temp;
}
public static void main(String[] args) {
int[] arr= {3,6,9,1,8,0,4,2};
heapSort(arr);
for(int i=0;i<arr.length;i++)
{
System.out.print(arr[i]+" ");
}
System.out.println();
int size=arr.length;
while(size>0)
{
swap(arr, size-1, 0);
heapify(arr,0,--size);
}
for(int i=0;i<arr.length;i++)
{
System.out.print(arr[i]+" ");
}
}
}