算法-堆排序

文章目錄

    • 整體架構流程
    • 技術細節
    • 小結

整體架構流程

大頂推:是構建一個完整的二叉樹
大頂推:即父節點的值大于左右子樹的值。

循環構建大頂推
在給定的數組,既可以明確樹的高度。
在循環的時候,構建樹的高度從lgn至0。即從堆低往堆頂構建。
構建過程中:如果左右子樹大于父節點,則交互數據后,在調整被交換的節點使其滿足大頂推。

提取大頂堆獲取排序值
從數組長度(i = a.length-1)至0循環:

  1. 交換0和i的值(即大頂堆的跟節點,即最大值)。完成升序排序最大值在數組末尾。
  2. 因將i的值替換到0的值位置,需要重新調整大頂堆。且將數組的長度限制小于i。

技術細節

package study.algorithm.sort;import java.util.Arrays;/*** 堆排序,是先構建一個完整的二叉樹*/
public class HeapSort {public static void main(String... args){int[] arr = {12, 11, 13, 5, 6, 7};System.out.println("排序前:"+ Arrays.toString(arr));sort(arr);System.out.println("排序后:"+ Arrays.toString(arr));}public static void sort(int[] arr) {builderMaxHeap(arr);// 逐個提取堆頂元素(最大值)并調整堆// 大頂堆的,最大值的索引是0。for (int i = arr.length - 1; i > 0; i--) {// 將當前堆頂元素(最大值)與末尾元素交換(即i)// 交換完成之后, 大于等于i的索引不參(i至arr.length)與后續大頂堆調整。int tmp = arr[0];arr[0] = arr[i];arr[i] = tmp;//調整剩余元素為最大堆,將最大值放在索引為0的位置。//指定需要調整的數組長度 i,從0索引位置開始調整大頂對。//因上一步,將未尾值換到了索引為0的位置,而索引0的左右子樹的值是剩余的最大值。maxHeap(arr,i,0);}}/*** 構建大頂推,即父節點的值,大于左右子樹的值*/public static void builderMaxHeap(int[] arr) {int n = arr.length;for (int i = n / 2; i >= 0; i--) {maxHeap(arr, n, i);}}/*** 構建大頂推,即父節點的值,大于左右子樹的值** @param arr 數組* @param n   需要調整整個數組的長度* @param i   父節點索引位置*/public static void maxHeap(int[] arr, int n, int i) {//最大值索引默認為i,i的左右子樹在數組中索引的位置int largest = i;int right = 2 * i + 1;int left = 2 * i + 2;//如果左子樹索引不越界(即存在左子樹),且左子樹的值大于,最大值索引的值if (left < n && arr[left] > arr[largest]) {largest = left;}//如果右子樹索引不越界(即存在右子樹),且右子樹的值大于,最大值索引的值if (right < n && arr[right] > arr[largest]) {largest = right;}//說明父節點的值,小于左右子樹的值//1. 調整堆的最大值位于父節點//2. 因左右子樹的值,存在修改則需要調整當前修改節點的堆,滿足大頂堆if (i != largest) {int temp = arr[i];arr[i] = arr[largest];arr[largest] = temp;maxHeap(arr, n, largest);}}
}

小結

構建大頂堆是從堆低往堆頂開始構建
每次獲取大頂堆最大的值,完成排序

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

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

相關文章

【鴻蒙HarmonyOS Next App實戰開發】二維碼生成技術實現與解析

隨著移動應用開發中對便捷交互體驗的需求日益增長&#xff0c;二維碼作為信息傳遞的重要載體&#xff0c;其生成與使用變得越來越普遍。本文將基于鴻蒙HarmonyOS應用開發框架&#xff0c;詳細介紹如何實現一個功能完備的二維碼生成器&#xff0c;并附上完整代碼解析。 注意該實…

1 Studying《Is Parallel Programming Hard》6-9

目錄 Chapter 6 Partitioning and Synchronization Design 6.1 分區練習 6.2 設計準則 6.3 同步粒度 6.4 并行快速路徑 6.5 超越黨派分歧 6.6 分區、并行和優化 Chapter 7 Locking 7.1 活命 7.2 鎖的類型 7.3 鎖定實施問題 7.4 基于鎖的存在性保證 7.5 鎖定&a…

Java練習題精選16-20

Java練習題精選16-20 一、第十六題二、第十七題三、第十八題四、第十九題五、第二十題一、第十六題 現有一個存放學生成績的數組{66, 77, 88, 99},要求將該數組正序輸出每個下標所對應的元素。 public class Test {public static void main(String[] args) {int<

新能源知識庫(68)汽車電鍍與蒸汽

汽車電鍍是提升零部件耐磨性、抗腐蝕性和美觀性的關鍵工藝&#xff0c;其流程根據基材&#xff08;金屬或塑料&#xff09;和部件功能需求有所差異。 汽車電鍍是以 基材特性和 功能需求為導向的精密工藝&#xff1a; ?金屬件?&#xff1a;核心流程為 ?除油→酸洗→電鍍→鈍…

Veo 3 視頻生成大模型完整操作教程(2025)

隨著 AI 多模態能力的飛躍&#xff0c;Google DeepMind 發布的 Veo 3 成為了生成視頻領域的一顆重磅炸彈。它不僅能夠根據文本生成高質量的視頻畫面&#xff0c;還能同步生成對白、背景音和環境音&#xff0c;是目前最接近真正“AI 導演”的大模型。 本文將帶你詳細了解 Veo 3…

10【認識文件系統】

1 認識硬件——磁盤 1.1 物理構成 磁盤是計算機中唯一的機械設備&#xff0c;同時也是一種外部存儲設備&#xff08;外設&#xff09;。早期的計算機通常配備的是機械硬盤&#xff08;HDD&#xff09;&#xff0c;依靠磁頭和盤片的機械運動來進行數據的讀寫。但隨著用戶對計算…

Windows命令連接符的安全風險分析與防御策略

1. 命令連接符簡介 在 Windows 的命令行環境&#xff08;CMD/PowerShell&#xff09;中&#xff0c;命令連接符用于在同一行執行多個命令&#xff0c;提高效率。然而&#xff0c;攻擊者常利用這些符號構造惡意命令&#xff0c;繞過安全檢測或執行多階段攻擊。 常見命令連接符…

大屏可視化制作指南

一、大屏可視化概述 &#xff08;一&#xff09;概念 大屏可視化是指通過大屏幕展示復雜數據的視覺呈現形式&#xff0c;它借助圖形、圖表、地圖等元素&#xff0c;將海量數據以直觀易懂的方式呈現出來&#xff0c;幫助用戶快速理解數據背后的含義和價值。 &#xff08;二&a…

Halcon ——— OCR字符提取與多類型識別技術詳解

工業視覺實戰&#xff1a;OCR字符提取與多類型識別技術詳解 在工業自動化領域&#xff0c;OCR字符提取是產品追溯、質量控制和信息讀取的核心技術。本文將深入解析Halcon中OCR字符提取的全流程&#xff0c;重點解釋核心算子參數&#xff0c;并提供完整的工業級代碼實現。 一、O…

嵌入式項目:基于QT與Hi3861的物聯網智能大棚集成控制系統

關鍵詞&#xff1a;MQTT、物聯網、QT、網絡連接、遠程控制 一、系統概述 本系統是一套完整的智能大棚監控解決方案&#xff0c;由兩部分構成&#xff1a; 基于Hi3861的嵌入式硬件系統&#xff08;負責環境數據采集和設備控制&#xff09;基于Qt開發的跨平臺控制軟件&#xf…

揭開 Git 裸倉庫的神秘面紗:`git clone --mirror` 詳解與使用指南

大家好&#xff01;在使用 Git 進行版本控制時&#xff0c;我們最熟悉的莫過于那些帶有工作目錄的本地倉庫了——我們在里面編輯文件、提交代碼&#xff0c;然后推送到遠程倉庫。但有時候&#xff0c;我們可能會遇到一種特殊的倉庫&#xff1a;裸倉庫&#xff08;Bare Reposito…

opensuse安裝rabbitmq

您好&#xff01;安裝 RabbitMQ 消息隊列是一個非常棒的選擇&#xff0c;它是許多現代應用架構中的核心組件。 在 openSUSE Tumbleweed 上安裝 RabbitMQ 主要有兩種流行的方式&#xff1a;一種是使用系統的包管理器 zypper&#xff0c;另一種是使用 Docker 容器。我將為您詳細…

超詳細YOLOv8/11圖像菜品分類全程概述:環境、數據準備、訓練、驗證/預測、onnx部署(c++/python)詳解

文章目錄 一、環境準備二、數據準備三、訓練四、驗證與預測五、模型部署 一、環境準備 我的都是在Linux系統下&#xff0c;訓練部署的&#xff1b;模型訓練之前&#xff0c;需要配置好環境&#xff0c;Anaconda、顯卡驅動、cuda、cudnn、pytorch等&#xff1b; 參考&#xff1…

JUC:4.線程常見操作與兩階段終止模式

在線程中&#xff0c;wait()、join()、sleep()三個方法都是進行阻塞的方法。對應可以使用interrupt()方法進行打斷&#xff0c;被打斷后線程會拋出打斷異常&#xff0c;但是不會修改IsInterrupt&#xff0c;也就是此時去調用IsInterrupted()方法后獲得的實際上是false。 而當線…

分布式session解決方案

在實際項目中&#xff0c;前臺代碼部署在nginx中&#xff0c;后臺服務內嵌了tomcat運行在不同的節點中&#xff0c;常見的架構如下&#xff1a; 在上述架構中&#xff0c;nginx轉發前臺請求&#xff0c;第一次登錄后&#xff0c;將用戶登錄信息寫入到一臺服務session中&#xf…

UDP 緩沖區

UDP 有接收緩沖區&#xff0c;沒有發送緩沖區 引申問題 1、為什么沒有發送緩沖區&#xff1f; 直接引用原文 “因為 UDP 是不可靠的&#xff0c;它不必保存應用進程的數據拷貝&#xff0c;因此無需一個真正的發送緩沖區” 2、沒有發送緩沖區的情況下&#xff0c;sendto 的數…

解密 C++ 中的左值(lvalue)與右值(rvalue)的核心內容

在 C 中&#xff0c;表達式&#xff08;expression&#xff09; 可以被歸類為左值或右值。最簡單的理解方式是&#xff1a; 左值&#xff08;lvalue&#xff09;&#xff1a; 能放在賦值號 左邊的表達式&#xff0c;通常表示一個有名字、有內存地址、可以持續存在的對象。你可…

MATLAB(2)選擇結構

選擇結構又可以叫做分支結構&#xff0c;它根據給定的條件是否成立&#xff0c;決定程序運行的方向。在不同的條件下執行不同的操作。 MATLAB可以用來實現選擇結構的語句有三種&#xff1a;if語句、switch語句、try語句。 一.if語句 1.if語句 1.1條件為矩陣的情況 if語句的…

Ehcache、Caffeine、Spring Cache、Redis、J2Cache、Memcached 和 Guava Cache 的主要區別

主流緩存技術 Ehcache、Caffeine、Spring Cache、Redis、J2Cache、Memcached 和 Guava Cache 的主要區別&#xff0c;涵蓋其架構、功能、適用場景和優缺點等方面&#xff1a; Ehcache 類型: 本地緩存&#xff08;JVM 內存緩存&#xff09; 特點: 輕量級&#xff0c;運行在 JV…

谷歌瀏覽器截圖全屏擴展程序

以下是一些支持跟隨鼠標滾輪滾動截圖的谷歌全屏截圖擴展程序插件&#xff1a; GoFullPage&#xff1a;這是一款專門截取整個網頁的截圖插件。安裝后&#xff0c;點擊瀏覽器右上角的圖標或使用快捷鍵AltShiftP&#xff0c;插件就會自動開始滾動并捕獲當前訪問的網站&#xff0c…