package com.base.junit;
/**
* <p>堆排序,算法:先将一个无序的数组构造成一个大顶堆,然后将堆顶的数与数组中的最后一个换位置,此时
* 数组最后一个元素就是最大值,然后将其他的n-1个数据做递归
* 堆:一棵完全二叉树,某非叶子节点 k 对应的节点为2k+1 与2k+2(小于数组length),某节点n对应的父节点 int ((n-1)/2)
*
* </p>
* @author baimiao
* */
public class HeapSort {
public static void main(String[] args) { int[] arr = new int[]{10, 2, 4, 9, 5, 12, 67, 8, 5, 5, 10, 3, 4, 1, 2, 1, 6, 7}; int length = arr.length; //遍历所有元素,每次循环都可以找出最大的一个放到数组末尾 //第一次循环找到所有元素最大的 //第二次循环找到所有元素第二大的,放到数组倒数第二位置...依次类推 for (int i = length - 1; i >= 0; i--) { buildHeap(arr, i); } for (int t : arr) { System.out.print(t + "\t"); } } //构建大顶堆,方法返回的是原数组的数据经过推排序把最大的元素的位置放到了最后面 private static void buildHeap(int[] array, int length) { int node = (length - 1) / 2; //循环所有非叶子节点,每一次循环相当于把一个节点与两个叶子(如果存在叶子节点)做比较,然后把最大的元素置为非叶子节点, // 所以经过整个便利,就把最大的元素置顶了 while (node >= 0) { int left = 2 * node + 1; int right = 2 * node + 2; if (left <= length) { compareAndSwap(array, left, node); } if (right <= length) { compareAndSwap(array, right, node); } node--; } //此时堆顶元素(数组第一个)是最大值,放到最后面 compareAndSwap(array, 0, length); } private static void compareAndSwap(int[] array, int leaf, int node) { if (array[leaf] > array[node]) { int temp = array[leaf]; array[leaf] = array[node]; array[node] = temp; } } }