目录
了解堆排序
先来了解完全二叉树。
完全二叉树与堆的关系:
最小堆:在满足作为完全二叉树的基础上,对于任意一个拥有父节点的子节点,其数值均不小于父节点的值;这样层层递推,就是根节点的值最小,这样的树,称为小根堆。
最大堆:同理,又有一棵完全二叉树,对于任意一个子节点来说,均不大于其父节点的值,如此递推,就是根节点的值是最大的,这样的数,称为大根堆。
如下图,a为最大堆,b为最小堆。
堆排序:
们先要做的是,把待排序的一堆无序的数,整理成一个大根堆,或者小根堆,然后将堆顶元素与堆底元素取下互换,在将除堆底元素以外的其他元素重新调整最大堆和最小堆,以最大堆为例。
堆排序Java代码实现
package sort; import java.util.Arrays; /** * @author zhang-jian * @date 2019/03/24 */ public class HeapSort { public static void main(String[] args) { int[] arr = new int[]{199, 2, 33, 22, 14, 643, 64, 3, 1}; sort(arr); System.out.println(Arrays.toString(arr)); } public static void sort(int[] arr) { /** * 将无序堆构建为最大堆 */ for (int i = arr.length / 2 - 1; i >= 0; i--) { adjustHeap(arr, i, arr.length); } /** * 将最大堆堆顶元素和堆元素互换,在重新构造剩余无序堆 */ for (int i = arr.length - 1; i > 0; i--) { swap(arr, 0, i); adjustHeap(arr, 0, i); } } /** * 调整最大堆 * @param arr * @param i * @param length */ public static void adjustHeap(int arr[], int i, int length) { for (int k = i * 2 + 1; k < length; k = k * 2 + 1) { if (k + 1 < length && arr[k + 1] > arr[k]) { k++; } if (arr[k] > arr[i]) { swap(arr, i, k); i = k; } else { break; } } } /** * 交换 * @param arr * @param i * @param j */ public static void swap(int[] arr, int i, int j) { int temp = arr[i]; arr[i] = arr[j]; arr[j] = temp; } }
堆排序
最新推荐文章于 2023-09-20 11:05:44 发布