1、预备知识
-
利用大顶堆进行升序排序
不多说,先看看大顶堆长什么鸟样
特征就是对于每一个局部二叉树,父节点总是大于左右子节点,左右节点的大小没有关系。
小顶堆同理。
-
二叉树和数组的关系:上面的二叉树可以转换成相应的数组是[90,80,70,60,50,60,20,10],具体怎么转化,苦于自身口技,大家就自己查资料吧
2、开始排序
2.1、基本思想:
对于算法,思想才是精髓。
1)将待排序的数组构造成大顶堆,整个序列的最大值就是堆顶;
2)将堆顶元素与序列的末尾元素进行交换,此时末尾为最大值,其不参与后面的排序;
3)将剩余的n-1个元素狗造成一个大顶堆,这样就得到了次小值,反复2,3操作,便可得到一个升序序列;
2.2、调整局部二叉树
对 下表为1的根节点进行调整
对应的代码
/**
* 对局部二叉树进行调整
* @param arr
* @param i
* @param len
*/
public static void adjustHeap(int[] arr, int i, int len){
int temp = arr[i];
for (int j = 2*i+1; j < len ; j = j*2+1) {
// 右子树不能越界
if (j+1 < len && arr[j] < arr[j+1]) {
j++;
}
//交换父节点和叶子节点
if (arr[j] > temp){
arr[i] = arr[j];
i = j;
}else {
break;
}
}
arr[i] = temp;
}
2.2、构建大顶堆和进行排序
//1)将待排序的数组构造成大顶堆,整个序列的最大值就是堆顶;
//2)将堆顶元素与序列的末尾元素进行交换,此时末尾为最大值,其不参与后面的排序;
//3)将剩余的n-1个元素狗造成一个大顶堆,这样就得到了次小值,反复2,3操作,便可得到一个升序序列;
public static void heapSort(int[] arr){
int temp = 0;
//调用上面的方法,调整为大顶堆
for (int i = arr.length/2-1 ; i >= 0; i--) {
adjustHeap(arr,i,arr.length);
}
for (int j = arr.length-1; j > 0 ; j--) {
temp = arr[j];
arr[j] = arr[0];
arr[0] = temp;
adjustHeap(arr,0,j);
}
}
测试结果
int[] arr = {4,6,8,5,9,35,56,3,2};
System.out.println("原始数组:"+Arrays.toString(arr));
heapSort(arr);
System.out.println("排序后数组:"+Arrays.toString(arr));