成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Java編程內功-數據結構與算法「堆排序」

開發 后端 算法
堆排序是利用堆這種數據結構而設計的一種排序算法,堆排序是一種選擇排序,它的最好、最壞、平均時間復雜度均為O(nlogn),它是不穩定排序。

[[389058]]

 堆排序基本介紹

  1. 堆排序是利用堆這種數據結構而設計的一種排序算法,堆排序是一種選擇排序,它的最好、最壞、平均時間復雜度均為O(nlogn),它是不穩定排序。
  2. 堆是具有以下性質的完全二叉樹:每個節點的值都大于等于其左右子節點的值,稱為大頂堆,注意:沒有要求最有子節點值得大小關系。
  3. 每個節點的值都小于等于左右子節點的值,稱為小頂堆。
  4. 大頂堆的特點:arr[i ] >= arr[2i+1] && arr[i] >= arr[2i+2], i 對應第幾個節點,i 從編號0開始。
  5. 小頂堆的特點: arr[i ] <= arr[2i+1] && arr[i] <= arr[2i+2], i 對應第幾個節點,i 從編號0開始。
  6. 一般升序采用大頂堆,降序采用小頂堆。

堆排序基本思想

  1. 將待排序序列構造成一個大頂堆
  2. 此時,整個序列的最大值就是堆頂的根節點。
  3. 將其與數組末尾元素進行交換,此時末尾就為最大值。
  4. 然后將剩余 n-1 個元素重新構建成一個堆,這樣會得到n個元素的次小值。如此反復執行,便能得到一個有序序列。

可以看到在構建大頂堆的過程中,元素的個數逐漸減少,最后得到一個有序序列了

一個數組中非葉子節點的個數 = arr.length / 2 - 1

代碼案例

  1. package com.xie.tree; 
  2.  
  3. public class HeapSort { 
  4.     public static void main(String[] args) { 
  5.         int[] arr = new int[8000000]; 
  6.         for (int i = 0; i < 8000000; i++) { 
  7.             arr[i] = (int) (Math.random() * 800000000); 
  8.         } 
  9.         long start = System.currentTimeMillis(); 
  10.         heapSort(arr); 
  11.         long end = System.currentTimeMillis(); 
  12.         System.out.println("耗時:" + (end - start) + "ms"); 
  13.         /** 
  14.          * 800萬數據 
  15.          * 堆排序!! 
  16.          * 耗時:2482ms 
  17.          */ 
  18.     } 
  19.  
  20.     public static void heapSort(int[] arr) { 
  21.         int temp = 0; 
  22.         System.out.println("堆排序!!"); 
  23.  
  24.         //1.將無序序列構成一個堆,根據升序降序需求選擇大頂堆或小頂堆 
  25.         for (int i = arr.length / 2 - 1; i >= 0; i--) { 
  26.             adjustHeap(arr, i, arr.length); 
  27.         } 
  28.         //2.將堆頂元素與數組末尾元素交換,將最大元素"沉"到數組末端 
  29.         //3.重新調整結構,使其滿足堆定義,然后繼續交換堆頂元素與當前末尾元素,反復執行調整+交換步驟,直到整個序列有序。 
  30.         for (int j = arr.length - 1; j > 0; j--) { 
  31.             //交換 
  32.             temp = arr[j]; 
  33.             arr[j] = arr[0]; 
  34.             arr[0] = temp
  35.             adjustHeap(arr, 0, j); 
  36.         } 
  37.     } 
  38.  
  39.     /** 
  40.      * 將一個數組(二叉樹),調整成一個大頂堆 
  41.      * 功能:完成將以 i 對應的非葉子節點的樹調整成大頂堆 
  42.      * 
  43.      * @param arr    待調整的數組 
  44.      * @param i      表示非葉子節點在數組的索引 
  45.      * @param length 表示對多少個元素進行調整,length在逐漸減少 
  46.      */ 
  47.     public static void adjustHeap(int[] arr, int i, int length) { 
  48.         //先取出當前元素的值,保存在臨時變量 
  49.         int temp = arr[i]; 
  50.         //k = 2 * i + 1  是i節點的左子節點 
  51.         for (int k = 2 * i + 1; k < length; k = k * 2 + 1) { 
  52.             //當左子節點值小于右子節點值 
  53.             if (k + 1 < length && arr[k] < arr[k + 1]) { 
  54.                 k++;//k指向右子節點 
  55.             } 
  56.  
  57.             //如果子節點值大于父節點值 
  58.             if (arr[k] > temp) { 
  59.                 //把較大的值賦給當前節點 
  60.                 arr[i] = arr[k]; 
  61.                 //!!! i指向k 繼續循環比較 
  62.                 i = k; 
  63.             } else { 
  64.                 break; 
  65.             } 
  66.         } 
  67.  
  68.         //當for循環結束后,我們已經將以 i 為父節點的樹的最大值,放在了最頂。 
  69.  
  70.         //將temp值放到調整后的位置 
  71.         arr[i] = temp
  72.     } 

 【編輯推薦】

 

責任編輯:姜華 來源: 今日頭條
相關推薦

2021-04-22 10:07:45

Java數據結構算法

2021-04-15 09:36:44

Java數據結構算法

2021-04-16 09:40:52

Java數據結構算法

2021-03-09 06:30:32

JAVA數據結構算法

2021-03-18 08:44:20

Java數據結構算法

2021-04-13 09:37:41

Java數據結構算法

2021-05-12 09:07:09

Java數據結構算法

2021-03-08 06:28:57

JAVA數據結構與算法稀疏數組

2021-03-10 08:42:19

Java數據結構算法

2021-03-17 09:27:36

Java數據結構算法

2021-03-12 09:13:47

Java數據結構算法

2021-03-26 08:40:28

Java數據結構算法

2021-03-29 10:13:47

Java編程數據結構算法

2021-03-14 08:27:40

Java數據結構算法

2021-04-07 09:26:37

Java數據結構算法

2021-05-13 07:34:56

Java數據結構算法

2021-03-24 10:41:04

Java數據結構算法

2021-04-23 09:12:09

Java數據結構算法

2021-03-11 08:53:20

Java數據結構算法

2021-05-08 08:28:38

Java數據結構算法
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 91精品国产乱码久久久久久久久 | 精品少妇一区二区三区日产乱码 | 精品国产一区二区在线 | 男人久久天堂 | av黄色在线观看 | 亚洲国产精品99久久久久久久久 | 91一区二区三区 | 1级毛片| 精品国产免费人成在线观看 | 欧美一级在线 | 精品久久成人 | 热久久999 | 男女免费在线观看视频 | 欧洲av在线 | 亚洲美女一区二区三区 | 少妇黄色 | 四虎在线观看 | 国产日韩欧美中文 | 亚洲精品久久久一区二区三区 | 久草新在线| wwwww在线观看| 91在线影院| 99re6在线 | 亚洲精彩免费视频 | 欧美一级毛片免费观看 | 亚洲精品欧美 | 欧美三级不卡 | 一区二区久久 | 亚洲性人人天天夜夜摸 | 啪一啪 | 成人在线视频一区二区三区 | 欧美日韩高清 | 中文字幕欧美一区 | 国产精品久久久久aaaa樱花 | 国产精品一区二区福利视频 | 国产亚洲精品久久久久动 | 国产欧美精品一区二区 | 九九热热九九 | 成人久草 | 亚洲欧美日韩中文在线 | 一区二区三区四区电影视频在线观看 |