前言數據 data 結構(structure)是一門 研究組織數據方式的學科,有了編程語言也就有了數據結構.學好數據結構才可以編寫出更加漂亮,更加有效率的代碼 。
- 要學習好數據結構就要多多考慮如何將生活中遇到的問題,用程序去實現解決.
- 程序 = 數據結構 + 算法
- 數據結構是算法的基礎, 換言之,想要學好算法,需要把數據結構學到位
注:數據結構與算法【Java】這一系列的博客參考于B站尚硅谷的視頻,視頻原地址為【尚硅谷】數據結構與算法(Java數據結構與算法)上一篇文章數據結構與算法【Java】07---樹結構基礎部分
1、堆排序1.1、堆排序簡介? 1.堆排序是利用堆這種數據結構而設計的一種排序算法,堆排序是一種選擇排序,它的最壞,最好,平均時間復雜度均為
O(nlogn),它是不穩定排序 。- 堆是具有以下性質的完全二叉樹:每個結點的值都大于或等于其左右孩子結點的值,稱為大根堆(或大頂堆), 注意 : 沒有要求結點的左孩子的值和右孩子的值的大小關系 。
- 每個結點的值都小于或等于其左右孩子結點的值,稱為小根堆(或小頂堆)
- 一般升序采用大根堆,降序采用小根堆

文章插圖

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

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

文章插圖
3.找到第二個非葉節點 4,由于[4,9,8]中 9 元素最大,4 和 9 交換 。

文章插圖
4.這時,交換導致了子根[4,5,6]結構混亂,繼續調整,[4,5,6]中 6 最大,交換 4 和 6 。

文章插圖
此時,我們就將一個無序序列構造成了一個大頂堆.
- 步驟二 將堆頂元素與末尾元素進行交換,使末尾元素最大 。然后繼續調整堆,再將堆頂元素與末尾元素交換得到第二大元素 。如此反復進行交換、重建、交換

文章插圖
2.重新調整結構,使其繼續滿足堆定義

文章插圖
經驗總結擴展閱讀
- 1 python-數據描述與分析
- 紅薯的功效與作用
- 創造與魔法最新每日禮包兌換碼是多少
- 芽莊沉香的香味與特點
- 蜂蜜的作用與功效減肥的方法
- 企業運維 | MySQL關系型數據庫在Docker與Kubernetes容器環境中快速搭建部署主從實踐
- 驅動通信:通過PIPE管道與內核層通信
- 橫隔板與濕接縫的區別
- 光與夜之戀雙十一禮包怎么購買
- 藥理學是什么
