堆排序(最大堆)

Posted Miss在学习

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了堆排序(最大堆)相关的知识,希望对你有一定的参考价值。

import java.util.Arrays;

 

public class HeapSort {

   

    //数组arr下标为0的位置不使用,待排序数字放入下标为 1 ~ arr.length-1 的位置,并对这些位置上的元素排序

 

    public static void sort(int arr[]) {

        HeapSort hs = new HeapSort();

        hs.buildMaxHeap(arr, 1, arr.length - 1);

        System.out.println("buildMaxHeap result : " + Arrays.toString(arr));

        hs.adjustHeap(arr, 1, arr.length - 1);

    }

 

 

    //建最大堆

    public void buildMaxHeap(int[] arr, int start, int end) {

        for (int i = end ; i >= start; i--) {

            downWithCycle(arr, i, end);

        }

    }

     

    //堆调整

    public void adjustHeap(int[] arr, int start, int end) {

        for (int i = end; i > start; i--) {

            swap(arr, start, i);

            System.out.println("swap result : " + Arrays.toString(arr));

            downWithCycle(arr, start, i - 1);

        }

    }

    

    //下滤

    public void downWithCycle(int[] arr, int start, int end) {

        if (start >= end) {

            return;

        }

        int index = start;

        int leftIndex = 2 * index;

        int rightIndex = 2 * index + 1;

        while (leftIndex <= end) {

            int biggestIndex = index;

            if(arr[leftIndex]>arr[biggestIndex]){

                biggestIndex = leftIndex;

            }

            if ((rightIndex <= end) && (arr[rightIndex] > arr[biggestIndex])) {

                biggestIndex = rightIndex;

            }

            if(biggestIndex != index){

                swap(arr,index,biggestIndex);

                index = biggestIndex;

                leftIndex = 2 * index;

                rightIndex = 2 * index + 1;

            }else{

                return ;

            }

        }

    }

 

    //交换下标为a和b的元素

    private void swap(int[] arr, int a, int b) {

        int temp = arr[a];

        arr[a] = arr[b];

        arr[b] = temp;

    }

 

    public static void main(String[] args) {

        int[] arr = { 0, 11, 2, 31, 444, 52, 16, 71, 8, 93, 10 };

        System.out.println("origin : " + Arrays.toString(arr));

        HeapSort.sort(arr);

        System.out.println("result : " + Arrays.toString(arr));

    }

 

}

以上是关于堆排序(最大堆)的主要内容,如果未能解决你的问题,请参考以下文章

堆排序python实现

最大堆与堆排序和优先队列

基于最大堆的堆排序算法

堆排序:什么是堆?什么是最大堆?二叉堆是什么?堆排序算法是怎么样的?PHP如何实现堆排序?

排序-堆排序

python 实现堆和堆排序