數據結構與算法【Java】08---樹結構的實際應用

前言數據 data 結構(structure)是一門 研究組織數據方式的學科,有了編程語言也就有了數據結構.學好數據結構才可以編寫出更加漂亮,更加有效率的代碼 。

  • 要學習好數據結構就要多多考慮如何將生活中遇到的問題,用程序去實現解決.
  • 程序 = 數據結構 + 算法
  • 數據結構是算法的基礎, 換言之,想要學好算法,需要把數據結構學到位
我會用數據結構與算法【Java】這一系列的博客記錄自己的學習過程,如有遺留和錯誤歡迎大家提出,我會第一時間改正!!!
注:數據結構與算法【Java】這一系列的博客參考于B站尚硅谷的視頻,視頻原地址為【尚硅谷】數據結構與算法(Java數據結構與算法)上一篇文章數據結構與算法【Java】07---樹結構基礎部分
1、堆排序1.1、堆排序簡介? 1.堆排序是利用堆這種數據結構而設計的一種排序算法,堆排序是一種選擇排序,它的最壞,最好,平均時間復雜度均為 O(nlogn),它是不穩定排序 。
  1. 堆是具有以下性質的完全二叉樹:每個結點的值都大于或等于其左右孩子結點的值,稱為大根堆(或大頂堆), 注意 : 沒有要求結點的左孩子的值和右孩子的值的大小關系 。
  2. 每個結點的值都小于或等于其左右孩子結點的值,稱為小根堆(或小頂堆)
  3. 一般升序采用大根堆,降序采用小根堆

數據結構與算法【Java】08---樹結構的實際應用

文章插圖

數據結構與算法【Java】08---樹結構的實際應用

文章插圖
1.2、堆排序過程演示
堆排序的基本思想是:
  1. 將待排序序列構造成一個大根堆
  2. 此時,整個序列的最大值就是堆頂的根節點 。
  3. 將其與末尾元素進行交換,此時末尾就為最大值 。
  4. 然后將剩余 n-1 個元素重新構造成一個堆,這樣會得到 n 個元素的次小值 。如此反復執行,便能得到一個有序序列了 。
步驟圖解
要求:給你一個數組 {4,6,8,5,9} , 要求使用堆排序法,將數組升序排序 。
  • 步驟一 構造初始堆 。將給定無序序列構造成一個大根堆(一般升序采用大根堆,降序采用小根堆) 。
  • 原始的數組 [4, 6, 8, 5, 9]
  1. 假設給定無序序列結構如下
    數據結構與算法【Java】08---樹結構的實際應用

    文章插圖
  2. 此時我們從最后一個非葉子結點開始(葉結點自然不用調整,第一個非葉子結點arr.length/2-1=5/2-1=1,也就是下面的 6 結點),從左至右,從下至上進行調整 。

數據結構與算法【Java】08---樹結構的實際應用

文章插圖
3.找到第二個非葉節點 4,由于[4,9,8]中 9 元素最大,4 和 9 交換 。
數據結構與算法【Java】08---樹結構的實際應用

文章插圖
4.這時,交換導致了子根[4,5,6]結構混亂,繼續調整,[4,5,6]中 6 最大,交換 4 和 6 。
數據結構與算法【Java】08---樹結構的實際應用

文章插圖
此時,我們就將一個無序序列構造成了一個大頂堆.
  • 步驟二 將堆頂元素與末尾元素進行交換,使末尾元素最大 。然后繼續調整堆,再將堆頂元素與末尾元素交換得到第二大元素 。如此反復進行交換、重建、交換
1.將堆頂元素 9 和末尾元素 4 進行交換
數據結構與算法【Java】08---樹結構的實際應用

文章插圖
2.重新調整結構,使其繼續滿足堆定義
數據結構與算法【Java】08---樹結構的實際應用

文章插圖

經驗總結擴展閱讀