堆排序的基本介绍
堆排序 的基本思想
基本步骤
1.数组结构情况
代码实现:
package tree;
import java.util.Arrays;
/**
* @author 一介草莽子
* version 1.0
*/
@SuppressWarnings({"all"})
public class HeapSort {
public static void main(String[] args) {
int arr[] = {4, 6, 8, 5, 9};
heapSort(arr);
}
public static void heapSort(int[] arr) {
//将一个无序序列构成一个堆
for (int i = arr.length / 2 - 1; i >= 0; i--) {
adjuctHeap(arr, i, arr.length);//第一次i=1
}
int temp = 0;
//将堆顶元素和末尾元素交换 把当前最大值放到最后
for (int j = arr.length - 1; j >= 0; j--) {
temp = arr[j];
arr[j] = arr[0];
arr[0] = temp;
//重新调整堆结构(调整为大顶堆或小顶堆)
adjuctHeap(arr, 0, j);
}
System.out.println("排序之后");
//打印
System.out.println(Arrays.toString(arr));
}
//将一个数组(二叉树) 转换为大顶堆
/**
* 功能:将以 i为非叶子节点的数调整成大顶堆
*
* @param arr 带调整的数组
* @param i 表示非叶子节点在数组中的索引
* @param length 表示对多少个数组元素调整
*/
public static void adjuctHeap(int arr[], int i, int length) {
//取出当前变量的值 放到临时变量 暂存
int temp = arr[i];
// k=i*2+1 是i节点的左叶子节点
for (int k = i * 2 + 1; k < length; k = k * 2 + 1) {
if (k + 1 < length && arr[k] < arr[k + 1]) {
k++; //k指向i节点下面的较大的右子节点
}
if (arr[k] > temp) {
arr[i] = arr[k];//把子节点赋值给父节点位置
i = k;//i指向k继续循环
} else {
break; //如果子节点不大于父节点就不用向上提 直接退出
}
}
arr[i] = temp;//将i放到调整之后的地方
}
}