package drug.sort;
import java.util.Arrays;
/**
* @author Drug
* @create 2020-05-04 16:08
*/
public class HeapSort {
public static void main(String[] args) {
int[] arr = {10,-1,-101,101,123,14};
headSort(arr);
System.out.println(Arrays.toString(arr));
}
public static void headSort(int[] arr) {
int temp = 0;
//从下到上,从右向左依次调整
for (int i = arr.length / 2 - 1; i >= 0; i--) {
adjustHeep(arr, i, arr.length);
}
//开始调整,堆顶永远是最大值,所以拿数组最后一个和第一个交换
for (int j = arr.length - 1; j > 0; j--) {
//交换arr[0]和当前数组最后一个
//记录堆顶最大值
temp = arr[0];
arr[0] = arr[j];
arr[j] = temp;
//调整后对新数组进行大顶堆排序
adjustHeep(arr, 0, j);
}
}
public static void adjustHeep(int[] arr, int i, int length) {
int temp = arr[i];
for (int k = i * 2 + 1; k < length; k = k * 2 + 1) {
//如果右节点大于左节点,将arr[k]设置成右节点
if (k+1 < length && arr[k + 1] > arr[k]) {
k++;
}
//如果子节点大于父节点,交换职位
if (arr[k] > temp) {
//较大值赋给当前节点
arr[i] = arr[k];
//i指向k
i = k;
} else {
break;
}
}
//结束循环时,i一开始的位置存放了子树的最大数,现在i位置放temp即可
arr[i] = temp;
}
}
java堆排序代码实现
最新推荐文章于 2024-08-11 10:39:52 发布