排序算法之堆排序【小二讲堂】
作者:互联网
【排序思想】:
大顶堆:堆的每个父节点都大于其孩子节点
小顶堆:堆的每个度节点都小于其孩子节点
堆排序的概要:首先对于一组数据,将这组数据填入到一个二叉树中,这是构成了初始堆
A. 将初始堆进行排序,排序成一个大顶堆(或小顶对),将子节点与其父节点进行比较数据大的放在父节点的位置,直到生成一个大顶堆.
B. 进行排序输出,规则,将跟节点上的数据进行与子节点中最小的数进行比较,将较小的数据交换至根节点,将最大的数进行输出,
C. 将最大的数进行输出后,进行筛选调整,根据A中排大顶堆的方法,进行排序,将根节点上的数据放到被输出数的孩子树枝上,然后进行交换输出,
。。。由上几步可以得出排序结果
堆排序图示:
构建初始堆:
开始排序:
【代码演示】
public static void sort(int[] array) {
init(array);
// 这个过程就是不断的从堆顶移除,调整
for (int i = 1; i < array.length; i++) {
int temp = array[0];
int end = array.length - i;
array[0] = array[end];
array[end] = temp;
adjust(array, 0, end);
}
}
//初始化堆,对对进行排序
private static void init(int[] array) {
for (int i = array.length / 2 - 1; i >= 0; i--) {
adjust(array, i, array.length);
}
}
//进行判断比较排序
private static void adjust(int[] array, int n, int size) {
int temp = array[n]; // 先拿出数据
int child = n * 2 + 1; // 这个是左孩子
while (child < size) { // 这个保证还有左孩子
// 如果右孩子也存在的话,并且右孩子的值比左孩子的大
if (child + 1 < size && array[child + 1] > array[child]) {
child++;
}
if (array[child] > temp) {
array[n] = array[child];
n = child; // n需要重新计算
child = n * 2 + 1; // 重新计算左孩子
} else {
// 这种情况说明左右孩子的值都比父结点的值小
break;
}
}
array[n] = temp;
}
小二讲堂:https://me.csdn.net/Mirror_w
排序算法大全:https://blog.csdn.net/mirror_w/article/category/8856271
标签:temp,int,堆排序,讲堂,child,array,排序,节点 来源: https://blog.csdn.net/Mirror_w/article/details/89789477