堆:完全二叉树
堆中i节点:
左孩子:2xi+1
右孩子:2×i+2
父节点:(i-1)/2
import java.util.Arrays;
/*
堆排序:
将数组处理成一个大根堆;
将堆的顶部与最后一个与元素进行交换,并将边界heapsize左移一位
将交换后的堆,重新调成大根堆;
重复步骤一。
*/
public class heapSort {
public static void main(String[] args) {
int[]arr={1,4,100,38,56,23,2,1,0,89,12,66,2,54,6,87,8,9756,8};
System.out.println(Arrays.toString(arr));
heapInsert(arr);
System.out.println(Arrays.toString(arr));
heapSort(arr);
System.out.println(Arrays.toString(arr));
}
//堆排序
public static void heapSort(int[] arr){
int heapsize=arr.length-1;
heapInsert(arr);
for (int i = 0; i < arr.length; i++) {
swap(arr,0,heapsize);
heapsize--;
heapfy(arr,0,heapsize);
}
}
//数组转换为大根堆
public static void heapInsert(int[]arr){
for (int heapsize = 0; heapsize<arr.length ; heapsize++) {
int index=heapsize;
while(arr[index]>arr[(index-1)/2]){
swap(arr,index,(index-1)/2);
index=(index-1)/2;
}
}
}
//将大根堆的堆某个元素换一个数,大根堆的调整
public static void heapfy(int[]arr,int index,int heapsize){
int left=2*index+1;
while (left<heapsize){
int largerest=left+1<heapsize&&arr[left]<arr[left+1] ? left+1:left;
largerest=arr[largerest]>arr[index]?largerest:index;
if (largerest==index){
break;
}
swap(arr,index,largerest);
index=largerest;
left=2*index+1;
}
}
public static void swap(int[]arr,int a,int b){
int tem=arr[a];
arr[a]=arr[b];
arr[b]=tem;
}
}