java——堆排序

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


这里写图片描述

这里写图片描述

堆排序的思想

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

时间复杂度为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) {
        if(array == null || array.length == 0) {
            return;
        }
    	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]

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

私密
私密原因:
请选择设置私密原因
  • 广告
  • 抄袭
  • 版权
  • 政治
  • 色情
  • 无意义
  • 其他
其他原因:
120
出错啦
系统繁忙,请稍后再试

关闭