堆排序算法

来源:互联网 发布:手机控制电脑 python 编辑:程序博客网 时间:2024/06/05 19:54

堆排序,是利用堆的性质进行一种选择排序

  堆,其实是一棵完全二叉树。(任何一非叶节点的关键字,不大于或者不小于其左右孩子节点的关键字)

  堆分为大顶堆 和 小顶堆:大于等于为大顶堆。小于等于 为 小顶堆

  

大顶堆,堆顶记录是最大关键字。小顶堆,堆顶记录是最小关键字。

  1.将 带排序的关键字(1~n),构成大顶堆,此时为初始无序区。

  2.将堆顶元素(1)与最后一个元素(n)交换。n就是最大值,进入有序区。 此时的无序区为,1~n-1。

  3.无序区,因为交换,可能违反堆的性质。将其调整为新堆。再将第一个与最后一个交换。


构造初始堆,和调整堆。是主要2个步骤。


我们来对 x[] = {15,7,5,20,17,8};进行堆排序

  

public class HeapSort {public static void main(String[] args) {int[] array = { 15,7,5,20,17,8 };System.out.println("Before heap:");ArrayUtils.printArray(array);heapSort(array);System.out.println("After heap sort:");ArrayUtils.printArray(array);}public static void heapSort(int[] array) {if (array == null || array.length <= 1) {return;}buildMaxHeap(array);for (int i = array.length - 1; i >= 1; i--) {ArrayUtils.exchangeElements(array, 0, i);maxHeap(array, i, 0);}}private static void buildMaxHeap(int[] array) {if (array == null || array.length <= 1) {return;}int half = array.length / 2;for (int i = half; i >= 0; i--) {maxHeap(array, array.length, i);}}private static void maxHeap(int[] array, int heapSize, int index) {int left = index * 2 + 1;int right = index * 2 + 2;int largest = index;if (left < heapSize && array[left] > array[index]) {largest = left;}if (right < heapSize && array[right] > array[largest]) {largest = right;}if (index != largest) {ArrayUtils.exchangeElements(array, index, largest);maxHeap(array, heapSize, largest);}}}

    


原创粉丝点击