堆排序
堆排序利用最大堆
最大堆就是一颗完全二叉树,最大元素在树根。
完全二叉树可以用数组来实现,有
parent(i) = i/2;
left(i) = 2*i;
right(i) = 2*i+1;
所以,过程大概就是:
1,先建最大堆
2,每次删除堆顶元素(即把未排序部分首位交换),整理最大堆,直到堆size为0.
/**
* 堆排序
*
* 利用优先队列,以 O(NlogN)时间排序
* 1.利用数组元素建立二叉堆,花费O(N)时间
* 2.执行N次deleteMax操作,得到N个元素的排序。每个deleteMax花费O(logN),总花费O(NlogN).
*
* 具体过程:
* 1.以线性时间建立一个最大二叉堆 ;
* 2.每次将堆中第一个元素(树根)与最后一个元素交换,堆的大小减1,并把当前堆整理为最大堆;
* 3.算法终止时,数组则以排好的顺序包含这些元素。
*/
public class HeapSort {
public static void heapSort(int[] arr) {
//建堆,arr.length/2 之后的结点都是树叶,所以从arr.length/2为子树树根向前建堆,保证每棵子树都是最大堆。
for (int i = arr.length / 2; i >= 0; i--)
maxify(arr, i, arr.length);
//删除最大
for (int i = arr.length - 1; i > 0; i--) {
//