選擇排序之堆排序(Java)

選擇排序之堆排序(Java)

博客說明java

文章所涉及的資料來自互聯網整理和我的總結,意在於我的學習和經驗彙總,若有什麼地方侵權,請聯繫本人刪除,謝謝!算法

說明

  • 堆排序是利用堆這種數據結構而設計的一種排序算法,堆排序是一種選擇排序,它的最壞,最好,平均時間複雜度均爲O(nlogn),它也是不穩定排序。數組

  • 堆是具備如下性質的徹底二叉樹:每一個結點的值都大於或等於其左右孩子結點的值,稱爲大頂堆網絡

    大頂堆特色:arr[i] >= arr[2i+1] && arr[i] >= arr[2i+2]數據結構

    i 對應第幾個節點,i從0開始編號dom

    image-20200807113120179

    注意 : 沒有要求結點的左孩子的值和右孩子的值的大小關係。學習

  • 每一個結點的值都小於或等於其左右孩子結點的值,稱爲小頂堆測試

    小頂堆特色:arr[i] <= arr[2i+1] && arr[i] <= arr[2i+2]ui

    i 對應第幾個節點,i從0開始編號設計

    image-20200807113253197

    通常升序採用大頂堆,降序採用小頂堆

思路

  • 將待排序序列構形成一個大頂堆
  • 此時,整個序列的最大值就是堆頂的根節點。
  • 將其與末尾元素進行交換,此時末尾就爲最大值。
  • 而後將剩餘n-1個元素從新構形成一個堆,這樣會獲得n個元素的次小值。如此反覆執行,便能獲得一個有序序列了。

代碼

package cn.guizimo.tree;

import java.util.Arrays;

/**
 * @author guizimo
 * @date 2020/8/7 11:43 上午
 */
public class HeapSort {
    public static void main(String[] args) {
        int max = 8000000;
        int[] arr = new int[max];
        for (int i = 0; i < max; i++) {
            arr[i] = (int)(Math.random() * 8000000);
        }
        long date1 = System.currentTimeMillis();
        heapSort(arr);
        long date2 = System.currentTimeMillis();
        System.out.println("堆排序"+max+"數組的時間爲:"+(date2-date1));
    }

    public static void heapSort(int arr[]) {
        int temp = 0;
        for (int i = arr.length / 2 - 1; i >= 0; i--) {
            adjustHeap(arr,i,arr.length);
        }
        //交換
        for (int j = arr.length-1;j>0;j--){
            temp = arr[j];
            arr[j] = arr[0];
            arr[0] = temp;
            adjustHeap(arr,0,j);
        }
        //System.out.println(Arrays.toString(arr));
    }

    //將數組變爲大頂推
    public static void adjustHeap(int arr[], int i, int length) {
        int temp = arr[i];
        for (int k = i * 2 + 1; k < length; k = k * 2 + 1) {
            if (k + 1 < length && arr[k] < arr[k + 1]) {
                k++;
            }
            if (arr[k] > temp) {
                arr[i] = arr[k];
                i = k;
            } else {
                break;
            }
        }
        arr[i] = temp;
    }
}

測試

image-20200807185032055

感謝

尚硅谷

萬能的網絡

以及勤勞的本身 關注公衆號: 歸子莫,獲取更多的資料,還有更長的學習計劃

相關文章
相關標籤/搜索