经典指数          
原因
1947
浏览数
0
收藏数
 

输入一个整型无序数组,用堆排序的方法使数组有序。

     举报   纠错  
 
切换
1 个答案

public class HeapSort

{

    public static void main(String[] args)

    {

        int[] arr = {4, 1, 3, 2, 16, 9, 10, 14, 8, 7};

        heapSort(arr);

        printHeap(arr);

    }

    //堆排序函数

    public static void heapSort(int[] arr)

    {

        int len = arr.length;

        buildHeap(arr, len); //首次建堆,建成一个完整的大顶堆(根节点为最大值)

        for (int i = 0; i < len; i++)

        {

            swap(arr, 0, len - 1 - i); //将堆顶元素(通过调整堆获得的最大值)和最后一个交换(剩余未排好序部分的最后一个)

            adjustHeap(arr, len - 1 - i, 0); //之后每次从堆顶开始调整,最大的值将上升到根节点

        }

    }

    //第一次建堆的过程

    public static void buildHeap(int[] arr, int maxlen)

    {

        int len = maxlen / 2 - 1; //完全二叉树的最后一个非叶子结点

        for (int i = len; i >= 0; i--)

        {

            adjustHeap(arr, maxlen, i);

        }

    }

    /**

    * maxlen 此次调整堆的最大元素个数(因为堆排序过程中,后面已经调整好的就不需要调整了)

    * i 表示此次调整堆的父节点

    * */

    public static void adjustHeap(int[] arr, int maxlen, int i)

    {

        int left = 2 * i + 1; //获得该父节点的左孩子

        int right = 2 * i + 2; //获得该父节点的右孩子

        int maxpos = i;

        while (left < maxlen)

        {

            if (right < maxlen && arr[maxpos] < arr[right])

            {

                maxpos = right;

            }

            if (arr[maxpos] < arr[left])

            {

                maxpos = left;

            }

            if (maxpos != i)

            {

                swap(arr, i, maxpos);

                i = maxpos; //继续向下调整,因为此次调整可能会破坏原来下面的堆

                left = 2 * i + 1;

                right = 2 * i + 2;

            }

            else

            {

                break;

            }

        }

    }

    //交换堆中任意两个数

    public static void swap(int[] arr, int from, int to)

    {

        int temp = arr[from];

        arr[from] = arr[to];

        arr[to] = temp;

    }

    //打印堆中的数据

    public static void printHeap(int[] arr)

    {

        int len = arr.length;

        for (int i = 0; i < len; i++)

        {

            System.out.print(arr[i] + " ");

        }

        System.out.println();

    }

}

 
切换
撰写答案