排序算法 - 堆排序

堆排序的步骤:

  1. 构造堆
  2. 固定最大值再构造堆
public class ArrayUtils {
	
	    public static void printArray(int[] array) {
		    System.out.print("{");
		    for (int i = 0; i < array.length; i++) {
			    System.out.print(array[i]);
			    if (i < array.length - 1) {
				    System.out.print(", ");
			    }
		    }
		    System.out.println("}");
	    }
 
	    public static void exchangeElements(int[] array, int index1, int index2) {
		    int temp = array[index1];
		    array[index1] = array[index2];
		    array[index2] = temp;
	    }
    }
public class HeapSort{
    public static void main(String[] args){
        int[] array = {9,8,7,6,5,4,3,2,1,0,-1};

        System.out.println("Before heap:");
        ArrayUtils.printArray(array);

        heapSort(array);

        System.out.println("After heap sort:");
        ArrayUtils.printArray(array);
    }

    public static void heapSort(int[] array){
        if(array==null || array.length <=1)
            return;

        buildMaxHeap(array);

        for(int i=array.length-1;i>=1;i--){
            ArrayUtils.exchangeElements(array,0,i);

            maxHeap(array,i,0);
        }
    }

    // 建堆的过程很简单,从下标 array.length 开始,
    // 对每个结点都执行 maxHeap() 就行了,但是叶子结点由于没有子结点,
    // 所以只需要从(array.length)/2开始
    private static void buildMaxHeap(int[] array){
        if(array==null || array.length <= 1){
            return;
        }

        int half =array.length/2;
        for(int i=half; i>=0;i--){
            maxHeap(array,array.length,i);
        }
    }

    private static void maxHeap(int[] array, int heapSize,int index){
        int left=index*2+1; // 数组是从 index 0 开始的
        int right =index*2+2;

        int largest =index;
        if(left<heapSize && array[left]>array[index]){
            largest =left;
        }

        if(right <heapSize && array[right] > array[largest]){
            largest = right;
        }

        if(index != largest){
            ArrayUtils.exchangeElements(array,index,largest);
            maxHeap(array.heapSize,largest);
        }
    }
}

参考博客:

  1. 堆排序(Heapsort)之Java实现:https://blog.youkuaiyun.com/kimylrong/article/details/17150475?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task
  2. 堆排序Heap Sort——浅显易懂+Java实现:https://blog.youkuaiyun.com/sunnylinner/article/details/52585225
  3. 堆排序算法(图解详细流程):https://blog.youkuaiyun.com/u010452388/article/details/81283998
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值