版权声明:本文为博主原创文章,转载请注明出处!!!小二学堂:https://blog.csdn.net/Mirror_w https://blog.csdn.net/Mirror_w/article/details/89789477
【排序思想】:
大顶堆:堆的每个父节点都大于其孩子节点
小顶堆:堆的每个度节点都小于其孩子节点
堆排序的概要:首先对于一组数据,将这组数据填入到一个二叉树中,这是构成了初始堆
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
转载请标明出处:排序算法之堆排序【小二讲堂】
文章来源: https://blog.csdn.net/Mirror_w/article/details/89789477