樹結構的實際應用之堆排序

樹結構的實際應用之堆排序
  • 基本介紹
    • 堆排序是利用堆這種數據結構設計而成的一種排序算法,堆排序是一種選擇排序,它的最壞,最好,平均時間復雜度為O(logn),它也是不穩定排序。
    • 堆是具有以下性質的完全二叉樹:每個結點的值都大于或等于其左右孩子結點的值,稱為大頂堆。注意:沒要求結點的左右孩子值的大小關系。
    • 每個結點的值都小于或者等于左右孩子結點的值,稱為小頂堆。
    • 大頂堆舉例說明
      大頂堆
    • 一般升序采用大頂堆,降序采用小頂堆
  • 堆排序基本思想
    • 將待排序序列構造成一個大頂堆
    • 此時,整個序列最大值就是根節點
    • 將其與末尾元素進行交換,將最大元素放到最后
    • 然后將剩余n-1個元素重新構造成一個堆,這樣就會得到n個元素的次小值,如此反復執行,便能得到一個有序序列了。
  • 堆排序步驟說明
    • 步驟一:構造初始堆,將給定無序序列構造成一個大頂堆(一般升序采用大頂堆,降序采用小頂堆)。原始的數組**[4,6,8,5,9]**
      • 假設無序序列的結構:請添加圖片描述
      • 此時,我們從最后一個非葉子結點開始,從右至左,從下到上調整。
        堆排序
      • 繼續處理第二個非葉子結點
        請添加圖片描述
      • 這時,交換導致了子樹[4,5,6]結構不符合,繼續調整
        請添加圖片描述
      • 此時,我們就將一個無序序列構造成了一個大頂堆
    • 步驟二:將堆頂元素與末尾元素進行交換,使末尾元素最大,然后繼續調整堆,再將堆頂元素與末尾元素交換得到第二大元素,如此反復進行交換、重建、交換。
  • 堆排序代碼實現
// 要求給一個數組[4,6,8,5,9],要求使用堆排序算法,將數組升序排序
import java.util.Arrays;public class HeapSort {public static void main(String[] args) {int[] arr = {4,6,8,5,9};System.out.println("排序前");System.out.println(Arrays.toString(arr));System.out.println("排序后");heapSort(arr);System.out.println(Arrays.toString(arr));}/*** 堆排序* @param arr*/private 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);}}/*** 完成以i對應的非葉子結點的樹調整成大頂堆*/public static void adjustHeap(int[] arr,int i,int length) {int temp = arr[i];for(int k = 2 * i + 1; k < length; k = 2 * k + 1) {// k中保存子節點中較大的值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;// 將值調整到適合位置}
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/87860.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/87860.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/87860.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

用OBS Studio錄制WAV音頻,玩轉語音克隆和文本轉語音!

言簡意賅的講解OBS Studio解決的痛點 隨著AI技術的快速發展&#xff0c;語音克隆與文本生成語音技術越來越受歡迎。無論你想要制作個人虛擬主播&#xff0c;還是給自媒體視頻配音&#xff0c;擁有高質量的原始音頻都是關鍵。本文詳細教你使用免費且功能強大的軟件——OBS Stud…

LangChain-5-agent

概述 Agent 是一種能夠基于接收到的輸入&#xff0c;利用自身的決策邏輯和可用的工具&#xff0c;動態地規劃并執行一系列操作&#xff0c;以達成特定任務的程序或系統。它在與外界交互過程中&#xff0c;會根據實時情況靈活調整策略&#xff0c;而不是按照固定的預設流程執行…

操作系統進程與線程核心知識全覽

本博客&#xff0c;根據王道所學。以下為第二章節知識點&#xff1a; 進程的概念、組成、狀態與其轉換、進程間通信、信號&#xff1b; 單/多線程模型、線程管理、調度時機的切換、調度的目標、調度算法、多處理機調度&#xff1b; 同步與互斥、進程互斥的軟硬件實現方法、信號…

C++中類型轉換操作符知識介紹

文章目錄 **一、類型轉換操作符的語法與定義****二、工作原理****三、示例&#xff1a;基本類型轉換****四、示例&#xff1a;轉換為自定義類型****五、與構造函數的對比****六、注意事項****七、應用場景****八、與 C 其他類型轉換的關系****九、總結** 在C中&#xff0c;類型…

2048小游戲C++板來啦!

個人主頁&#xff1a;PingdiGuo_guo 收錄專欄&#xff1a;C干貨專欄 大家好呀&#xff0c;我是PingdiGuo_guo&#xff0c;今天我們來學習如何用C編寫一個2048小游戲。 文章目錄 1.2048的規則 2.步驟實現 2.1: 初始化游戲界面 2.1.1知識點 2.1.2: 創建游戲界面 2.2: 隨機…

TensorFlow深度學習實戰——Transformer變體模型

TensorFlow深度學習實戰——Transformer變體模型 0. 前言1. BERT2. GPT-23. GPT-34. Reformer5. BigBird6. Transformer-XL7. XLNet8. RoBERTa9. ALBERT10. StructBERT11. T5 和 MUM12. ELECTRA13. DeBERTa14. 進化 Transformer 和 MEENA15. LaMDA16. Switch Transformer17. RE…

還原自動駕駛的“前世今生”:用 Python 實現數據記錄與回放系統

還原自動駕駛的“前世今生”:用 Python 實現數據記錄與回放系統 你有沒有想過這樣一個場景: 一輛自動駕駛測試車,在街頭拐了個彎,卻突然急剎。測試員一臉懵,研發團隊問:“數據記錄了嗎?” 他攤攤手:“系統當時沒掛上錄制……” 對不起,重測吧。 這不是段子,而是我在…

access和excel用vba進行輔助辦公軟件開發

1、access用vba創建子窗口child查詢 出現這個報錯的時候&#xff0c;一般是用vba通過ado.connection連接&#xff0c;沒有綁定數據源造成的&#xff1a; 先綁定再使用 Me.Child2.SourceObject "表.資產管理" 連接數據源 Me.Child2.Form.RecordSource strSql …

Nginx+tomcat集群

Nginxtomcat集群 一、Nginx 簡介 1.1 定義 Nginx 是一個高性能的 HTTP 和反向代理 web 服務器&#xff0c;同時支持 IMAP/POP3/SMTP 服務。由俄羅斯工程師伊戈爾?賽索耶夫開發&#xff0c;于 2004 年首次公開發布&#xff0c;基于 BSD-like 協議&#xff0c;代碼開源且免費…

RPC - 客戶端注冊和發現模塊

registryMethod 函數詳解&#xff1a; 函數目的 registryMethod 是 Provider 類的核心方法&#xff0c;用于向服務注冊中心注冊服務。注冊成功后&#xff0c;服務注冊中心會更新內部的服務映射表&#xff0c;建立服務名稱到提供者地址的映射關系。 執行流程示例 場景: 多米…

leetcode332.重新安排行程:優先隊列與DFS實現歐拉路徑的行程規劃

一、題目深度解析與行程規劃本質 題目描述 給定一個機票的字符串二維數組 tickets&#xff0c;每個元素是 [from, to] 的形式&#xff0c;表示從 from 到 to 的機票。要求找出從 JFK 出發的行程&#xff0c;且必須使用所有機票&#xff0c;若存在多種可能的行程&#xff0c;返…

1.21SQLCipher 簡介

SQLCipher 是一個基于 SQLite 的擴展&#xff0c;提供了透明的數據庫加密功能。與普通 SQLite 不同&#xff0c;SQLCipher 在數據寫入磁盤前自動加密&#xff0c;讀取時自動解密&#xff0c;無需開發者手動處理加密邏輯。這使得它非常適合移動應用、桌面應用等需要本地數據加密…

無人機不再“盲飛”!用Python搞定實時目標識別與跟蹤

友友們好! 我是Echo_Wish,我的的新專欄《Python進階》以及《Python!實戰!》正式啟動啦!這是專為那些渴望提升Python技能的朋友們量身打造的專欄,無論你是已經有一定基礎的開發者,還是希望深入挖掘Python潛力的愛好者,這里都將是你不可錯過的寶藏。 在這個專欄中,你將會…

Vue-7-前端框架Vue之應用基礎從Vue2語法到Vue3語法的演變

文章目錄 1 基于vite創建1.1 對比webpack和vite1.2 創建工程1.3 啟動項目2 調試工具Vue.js Devtools3 src結構3.1 index.html3.2 main.ts3.3 App.vue(根組件)4 示例(Vue2的語法)4.1 Person.vue4.2 App.vue4.3 選項式API對比組合式API4.4 程序流程5 示例(Vue3的語法)5.1 setup概…

上線iOSApp前抓包工具協作保障接口行為一致性(iOS抓包)

項目上線前&#xff0c;你是否總會擔心“接口是不是在某個邊緣條件下表現不一致”&#xff1f;哪怕單元測試通過、接口文檔齊全&#xff0c;真到線上用戶手上&#xff0c;總還是可能出現一些環境相關的異常。 最近參與某App大版本上線前的質量驗證流程&#xff0c;我們特別安排…

Java可變參數:靈活編程的秘密武器

Java可變參數的理解與應用 Java中的可變參數&#xff08;Varargs&#xff09;允許方法接受數量不定的同類型參數&#xff0c;簡化了方法調用時的參數傳遞。可變參數通過在參數類型后添加...實現&#xff0c;本質上是一個數組&#xff0c;但在調用時可以傳入多個單獨的參數。 …

汽車 CDC威脅分析與風險評估

汽車 CDC&#xff08;連續阻尼控制系統&#xff09;的威脅分析與風險評估需結合其技術特性、應用場景及行業標準展開。以下是詳細解析及實例說明&#xff1a; 一、CDC 系統技術原理與結構 CDC&#xff08;Continuous Damping Control&#xff09;通過實時調節懸掛阻尼力提升駕…

TensorFlow 安裝與 GPU 驅動兼容(h800)

環境說明TensorFlow 安裝與 GPU 驅動兼容CUDA/H800 特殊注意事項PyCharm 和終端環境變量設置方法測試 GPU 是否可用的 Python 腳本 # 使用 TensorFlow 2.13 在 NVIDIA H800 上啟用 GPU 加速完整指南在使用 TensorFlow 進行深度學習訓練時&#xff0c;充分利用 GPU 能力至關重要…

Laravel 項目中圖片上傳后無法訪問的問題

情況&#xff1a; Laravel 提供了 php artisan storage:link 命令&#xff0c;用于創建符號鏈接&#xff08;Symbolic Link&#xff09;&#xff0c;將 storage/app/public 映射到 public/storage。但是上傳圖片之后 文件目錄確實有 但是無法訪問。 1. 刪除已經創建的 rm -rf…

Tesollo攜人形機器人手進軍國內市場

Tesollo靈巧手是Tesollo公司研發的一系列機器人靈巧手產品&#xff0c;涵蓋兩指到五指的設計 產品型號與特點 Delto-5F五指靈巧手&#xff1a;具備20個自由度&#xff0c;每個手指配備4個獨立關節&#xff0c;抓握力達到7公斤&#xff0c;每個關節空載可達75轉/分鐘&#xff0…