博客說明java
文章所涉及的資料來自互聯網整理和我的總結,意在於我的學習和經驗彙總,若有什麼地方侵權,請聯繫本人刪除,謝謝!算法
堆排序是利用堆這種數據結構而設計的一種排序算法,堆排序是一種選擇排序,它的最壞,最好,平均時間複雜度均爲O(nlogn),它也是不穩定排序。數組
堆是具備如下性質的徹底二叉樹:每一個結點的值都大於或等於其左右孩子結點的值,稱爲大頂堆網絡
大頂堆特色:arr[i] >= arr[2i+1] && arr[i] >= arr[2i+2]數據結構
i 對應第幾個節點,i從0開始編號dom
注意 : 沒有要求結點的左孩子的值和右孩子的值的大小關係。學習
每一個結點的值都小於或等於其左右孩子結點的值,稱爲小頂堆測試
小頂堆特色:arr[i] <= arr[2i+1] && arr[i] <= arr[2i+2]ui
i 對應第幾個節點,i從0開始編號設計
通常升序採用大頂堆,降序採用小頂堆
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; } }
感謝
尚硅谷
萬能的網絡
以及勤勞的本身 關注公衆號: 歸子莫,獲取更多的資料,還有更長的學習計劃