数据结构与算法之美代码:排序算法之堆排序

堆排序原理

堆排序包含两个过程,建堆和排序。我们将下标从 1/2*n​ 到 1 的节点,依次进行从上到下的堆化操作,然后就可以将数组中的数据组织成堆这种数据结构。接下来,我们迭代地将堆顶的元素放到堆的末尾,并将堆的大小减一,然后再堆化,重复这个过程,直到堆中只剩下一个元素,整个数组中的数据就都有序排列了。

代码实现

package com.athome.heap;



public class HeapSortDemo {
    public static void main(String[] args) {
        int[] arr = {7, 3, 10, 12, 5, 1, 9, 2};
        HeapSort heapSort = new HeapSort();
        heapSort.sort(arr);
        for (int i = 0; i < arr.length; i++) {
            System.out.print (arr[i]+" ");
        }

    }

}
//排序:堆元素是从数组下标0开始的
class HeapSort{
    public HeapSort() {
    }

    public static void sort(int[] arr){
        if(arr.length<=1){
            return;
        }
    //1.建堆
        buildHeap(arr);
    //2.排序
    int k =arr.length -1;
    while( k > 0){
        //将堆顶元素(最大),与最后一个元素交换位置
        swap(arr,0,k);
        //将剩下元素重新堆化,堆顶元素变成最大元素
        heapify(arr,--k,0);

    }



    }

    private static void swap(int[] arr, int i, int k) {
        int temp = arr[i];
        arr[i] = arr[k];
        arr[k] = temp;
    }


    //堆化:arr要堆化的数组,n最后堆元素下标,i要堆化的元素下标
    private static void heapify(int[] arr, int n, int i) {
        while(true){
            //最大位置
            int maxPos =i;
            //与左子节点(i*2 +1)比较,获取最大值位置
            if(i*2 +1 <=n && arr[i] <arr[i*2 +1]){
                maxPos = i*2 +1;

            }
            //最大值与右子节点(i*2+2)比较,获取最大值位置
            if(i*2 +2 <=n && arr[maxPos] <arr[i*2 +2]){
                maxPos = i*2 +2;
            }
            //最大值是当前位置结束循环
            if(maxPos == i){
                break;
            }
            //与子节点较好位置
            swap(arr,i,maxPos);
            i = maxPos;

        }

    }


    //建堆
    private static void buildHeap(int[] arr) {
        //(arr.length-1)/2为最后一个叶子节点的父节点,也就是最后一个非叶子节点,依次堆化到根节点
        for (int i = (arr.length - 1)/2; i >= 0; i--) {
            heapify(arr,arr.length-1,i);

        }


    }


}

你可能感兴趣的:(数据结构与算法之美代码,排序算法,算法,java)