天下脸皮共十分
我占八分

HeapSort

核心要点

1、构造一个大顶堆

2、取堆顶置堆尾交换

3、循环将堆顶置到对应位置

4、重复②③直到堆尺寸为1

代码实现

package ityoung.tech.sort;

import ityoung.tech.util.ArrayUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.Arrays;

public class HeapSort {

    private static Logger log = LoggerFactory.getLogger(HeapSort.class);

    public static void main(String[] args) {
//        int[] arr = {1, 5, 7, 6, 0, 2, 8, 9, 3, 4};
        int[] arr = ArrayUtil.getRandomArr(80000000);
        log.info("排序前~~~");
        heapSort(arr);
        log.info("排序后~~~");
//        System.out.println(Arrays.toString(arr));
    }

    private static void heapSort(int[] arr) {
/*        for (int range = arr.length; range > 0; range--) {

            int temp;
            for (int j = range / 2 - 1; j >= 0; j--) {
                adjust(arr, j, range);
            }
            temp = arr[0];
            arr[0] = arr[range - 1];
            arr[range - 1] = temp;
        }*/
        for (int i = arr.length / 2 - 1; i >= 0; i--) {
            adjust(arr, i, arr.length);
        }

        int temp;
        for (int i = arr.length - 1; i >= 0; i--) {
            temp = arr[0];
            arr[0] = arr[i];
            arr[i] = temp;
            adjust(arr, 0, i);
        }

    }

    private static void adjust(int[] arr, int i, int length) {
        int temp = arr[i];
        for (int k = i * 2 + 1; k < length; k = i * 2 + 1) {
            if (k + 1 < length && arr[k] < arr[k + 1]) {
                k++;
            }
            if (arr[i] <= arr[k]) {
                arr[i] = arr[k];
                arr[k] = temp;
            }
            i = k;
        }

    }
}
赞(0) 打赏
未经允许不得转载:Stephen Young » HeapSort
分享到: 更多 (0)

相关推荐

评论 抢沙发

评论前必须登录!

 

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏