package com.hzins.suanfa;
import java.util.Arrays;
/**
* 堆排序
* 思路,建立最大堆并把最大的数移到最后,从第一行到倒数第二行建立最大堆
* 建立最大堆:
* for循环 以lastindex的父节点为起始位,每此循环自减,直到为1
* 对于每个父节点肯定会有左子树(要不然他就不是父节点了) 判断有没有右字数
* 拿到这两个位置的最大值,然后与父节点做比较,最大的放在父节点上,依次循环
* 树顶判断完毕
* @author Administrator
*
*/
public class HeapSort {
public static void heapSort(int[] data){
for(int i = data.length - 1;i >= 1; i--){
createMaxHeap(data, i);
swap(data, i, 0);
}
}
/**
* 参数lastIndex是用来做出父节点的,如果lastIndex为0的话
* (lastIndex - 1) / 2算出的父节点为负,越界了,所以lastIndex最小为1
* @param data
* @param lastIndex
*/
public static void createMaxHeap(int[] data, int lastIndex){
for(int i = (lastIndex - 1) / 2; i >= 0; i --){
//父节点
int k = i;
int bigger = k * 2 + 1; // 定义最大为左孩子
//有rightChildren
if(k * 2 + 2 <= lastIndex){
bigger = data[bigger] > data[k * 2 + 2] ? bigger : bigger + 1;
}
if(data[k] < data[bigger]){
swap(data, k, bigger);
}
}
}
public static void swap(int[] array, int a, int b){
int temp = array[a];
array[a] = array[b];
array[b] = temp;
}
//start 6, 4, 7, 3, 3, 1, 8
public static void main(String[] args) {
int[] array = {6, 4, 7, 3, 3, 1, 8};
heapSort(array);
// createMaxHeap(array, 0);
System.out.println(Arrays.toString(array));
}
}