首页 > 代码库 > 堆排序

堆排序

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));
    }
}

 

堆排序