堆排序

堆排序要从小到大输出,用大根堆:


这里写图片描述

这里写图片描述

堆排序的思想

堆排序可以说是选择排序的改进版,它可以减少在选择排序中的比较次数,进而减少排序的时间。

时间复杂度为O(nlogn)

不稳定

空间复杂度:O(1)

例如有如下一组数据

68,98,52,32,17,19,14,32

把它转化成二叉树:

这里写图片描述

那么把这个二叉树变成堆积树:

这里写图片描述

这里写图片描述

这里写图片描述

这里写图片描述

这里写图片描述

这里写图片描述

这里写图片描述

这里写图片描述

这里写图片描述

这里写图片描述

这里写图片描述

这里写图片描述

动态示意图:
这里写图片描述

package javapaixu;

import java.util.Arrays;

public class Dui {
    public static void adjust(int[] array,int start,int end) {
        int tmp = array[start];
        for(int i = 2*start+1;i <= end;i = 2*i+1) {
            //找到左右孩子的最大值    i   最大值下标
            if(i < end && array[i] < array[i+1]) {//保证有右孩子
                i++;
            }

            if(array[i] > tmp) {
                array[start] = array[i];
                start = i;
            }

            if(array[i] < tmp) {
                break;
            }
        }
        array[start] = tmp;
    }

    public static void heapSort(int[] array) {
        for(int i = (array.length-1-1)/2;i >= 0;i--) {
            adjust(array,i,array.length-1);
        }
        //最后一个值和根节点交换
        int tmp = 0;
        for(int j = 0;j < array.length-1;j++) {
            tmp = array[0];
            array[0] = array[array.length-1-j];
            array[array.length-1-j] = tmp;
            //只需要调整最大的数就好了,因为其他的子树已经是大根堆了
            adjust(array,0,array.length-1-1-j);
        }
    }
    public static void main(String[] args) {
        int[] array = {68,98,52,32,17,19,14,32};
        heapSort(array);
        System.out.println(Arrays.toString(array));
}

}

运行结果:

[14, 17, 19, 32, 32, 52, 68, 98]
阅读更多
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页