Java排序算法实现----堆排序

public class HeapSortDemo {
    static int length;
    public static void hsa(int[] array){
        length = array.length;
        //将无序数组构建为大顶堆(从最后一个非叶子节点开始,按照层级遍历的倒序调整)
        for (int i=array.length-1;i>=0;i--){
            adjustToBigHeap(array,i);
        }
        while (length>0){
            //每一次调整完,未排序序列的最大数即为第一个数,将第一个数与未排序序列最后一个数交换位置
            int temp = array[length-1];
            array[length-1] = array[0];
            array[0] = temp;
            length--;
            adjustToBigHeap(array,0);
        }
    }

    public static void adjustToBigHeap(int[] array, int i){
        //找到父节点,左子节点,右子节点中的最大值,并与父节点交换位置
        int maxIndex = i;
        if (2*i+1<length && array[2*i+1] > array[maxIndex]){
            maxIndex = 2*i+1;
        }
        if (2*i+2<length && array[2*i+2] > array[maxIndex]){
            maxIndex = 2*i+2;
        }
        if (maxIndex != i){
            int temp = array[i];
            array[i] = array[maxIndex];
            array[maxIndex] = temp;
            //调整被交换位置的节点,及其左右子节点的最大值
            adjustToBigHeap(array,maxIndex);
        }
    }

    public static void main(String[] args) {
        int[] array = {3,4,6,1,7,5,2,34,98};
        hsa(array);
    }
}

实现流程:主要有两部分需要理解
1.将无序数组构建为大(小)顶堆
2.将最大值与尾部元素交换,并缩小数组长度,调整大(小)顶堆
3.循环第2步,直到剩余待排序长度为1

时间复杂度:O(nlogn)

空间复杂度:O(1)

你可能感兴趣的:(Java排序算法实现)