堆排序
1.调整成大根堆
2.将堆顶元素与最后一个元素交换
/**
* adjustheadsort:某节点调整为大根堆
* @param arr
* @param i 非叶子结点在数组中索引
* @param length 表示对多少个元素进行调整
*/
public static void adjustheadsort(int[] arr,int i,int length) {
int temp = arr[i];
//i结点对应的左孩子结点k、右孩子结点k+1
for(int k = i*2 +1;k<length;k = k*2+1) {
if(k+1<length && arr[k]<arr[k+1]) {
k++;
}
//此时arr[k]指向最大的值
if(arr[k]>temp) {
//最大的结点给双亲,且指向循环
arr[i]=arr[k];
i=k;
//可以看作是从后往前比较
}else {
break;
}
}
//双亲赋值给原有的最大结点
arr[i]=temp;
}
//总的调用方法
public static void sortall(int[] arr) {
int temp = 0;
//找到最后一个非叶子节点
for(int i = arr.length/2 - 1;i>=0;i--) {
adjustheadsort(arr, i, arr.length);
}
//调整次数是数组长度减一,即交换时j=0不再交换
for(int j = arr.length-1;j>0;j--) {
temp = arr[j];
arr[j] = arr[0];
arr[0]=temp;
adjustheadsort(arr, 0, j);
}
System.out.println(Arrays.toString(arr));
}