堆排序的詳細解讀

一.堆的基本概念

1.什么是堆

堆是一種特殊的完全二叉樹,滿足一下性質:

  • 最大堆每個節點的值都大于或等于其子節點的值(堆頂元素最大)
  • 最小堆:每個節點的值都小于或等于其子節點的值(堆頂元素最小)

其中,堆排序常使用最大堆來進行升序排序

?2.堆的存儲

堆常用數組進行存儲,對于數組中第i個元素:

  • 父節點的位置:(i-1)/2
  • 左節點的位置:2*i+1
  • 右節點的位置:2*i+2

二、堆排序的基本思想

堆排序的基本思想分為兩個主要步驟:
1. 建堆:將無序數組構建成一個最大堆
2. 排序:重復從堆中取出最大元素(堆頂),然后調整剩余元素使其重新成為最大堆

三、堆排序的詳細步驟

?1. 構建最大堆
從最后一個非葉子節點開始(即n/2 - 1),向前依次對每個節點執行"下沉"操作,確保以該節點為根的子樹滿足堆的性質。

下沉操作:
1. 比較當前節點與其左右子節點
2. 如果當前節點小于某個子節點,則與較大的子節點交換
3. 繼續向下比較,直到當前節點大于等于其子節點或到達葉子節點

2. 排序過程
1. 將堆頂元素(最大值)與堆的最后一個元素交換
2. 堆的大小減1(排除已排序的元素)
3. 對新的堆頂元素執行下沉操作,恢復堆的性質
4. 重復上述過程,直到堆中只剩一個元素

演示:?

?

四、堆排序的代碼實現

#include<iostream>
#include<algorithm>using namespace std;//重建堆
void adjust(int a[],int start,int end)
{int temp=a[start];    //根節點for(int i=2*start+1;i<=end;i=i*2+1)   //從左子樹開始{if(i<end&&a[i]<a[i+1])    //如果右子樹大于左子樹,則i指向右子樹{i++;}if(a[i]>temp)    //如果子節點大于根節點,則將子節點的值賦給根節點{a[start]=a[i];start=i;}else    //如果子節點小于根節點,則跳出循環{break;}}a[start]=temp;    //將根節點的值賦給子節點
}//堆排序
void heapsort(int a[],int n)
{//建立大根堆for(int i=n/2-1;i>=0;i--)   //從最后一個非葉子節點開始{adjust(a,i,n-1);    //調整堆}//交換堆頂和堆底元素,重新調整堆for(int i=n-1;i>0;i--){swap(a[0],a[i]);    //交換堆頂和堆底元素adjust(a,0,i-1);    //調整堆}
}int main()
{int a[]={46,55,13,42,94,17,5,70};int n=sizeof(a)/sizeof(a[0]);heapsort(a,n);for(int i=0;i<n;i++){cout<<a[i]<<" ";}return 0;
}

五、堆排序的優缺點

優點:
1. 時間復雜度穩定為O(n log n),沒有最壞情況
2. 空間復雜度低,是原地排序算法
3. 適合處理大規模數據

?缺點:
1. 不穩定排序算法(相同元素的相對位置可能改變)
2. 在數據量較小的情況下,常數因子較大,可能不如插入排序等簡單算法快
3. 數據訪問方式不夠局部化(緩存不友好)

六、堆排序的應用場景

1. 需要穩定O(n log n)時間復雜度的場景
2. 內存受限的環境(因為它是原地排序)
3. 需要同時進行插入和提取最大/最小值的場景(優先隊列)
4. 實時系統,因為最壞情況性能好

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

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

相關文章

hmdp知識點

1. 前置知識 1.1 MyBatisPlus的基本使用 1.1.1 引入依賴 <dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.4.3</version> </dependency> 1.1.2 建立實體類和數…

分享5個免費5個在線工具網站:Docsmall、UIED Tool在線工具箱、草料二維碼、圖片在線壓縮、表情符號

01. Docsmall 它是一個免費的在線圖片與PDF處理工具&#xff0c;功能主要包含Ai圖片處理工具&#xff0c;圖片壓縮工具&#xff0c;圖片PDF格式轉換工具等&#xff0c;如下圖&#xff0c;我認為比較實用的是自動摳圖、圖片變高清、圖片壓縮和PDF壓縮。 https://docsmall.com/…

打通印染車間“神經末梢”:DeviceNet轉Ethernet/IP連接機器人的高效方案

在印染行業自動化升級中&#xff0c;設備聯網需求迫切。老舊印染設備多采用Devicenet協議&#xff0c;而新型工業機器人普遍支持Ethernet/IP協議&#xff0c;協議不兼容導致數據交互困難&#xff0c;設備協同效率低、生產監控滯后&#xff0c;成了行業數字化轉型的阻礙。本文將…

RSA加密算法:非對稱密碼學的基石

一、RSA算法概述 RSA&#xff08;Rivest-Shamir-Adleman&#xff09;是1977年由Ron Rivest、Adi Shamir和Leonard Adleman提出的非對稱加密算法&#xff0c;它基于大數分解的數學難題&#xff0c;是當今應用最廣泛的公鑰密碼系統。RSA的核心思想是使用一對密鑰&#xff08;公鑰…

杭州瑞盟 MS35774/MS35774A 低噪聲256細分微步進電機驅動,用于空調風門電機驅動,香薰電機驅動

杭州瑞盟 MS35774/MS35774A 低噪聲256細分微步進電機驅動&#xff0c;用于空調風門電機驅動&#xff0c;香薰電機驅動 簡述 MS35774/MS35774A 是一款高精度、低噪聲的兩相步進 電機驅動芯片&#xff0c;芯片內置功率 MOSFET &#xff0c;長時間工作的平均電 流可以達到 1…

駛向智能未來:車載 MCP 服務與邊緣計算驅動的駕駛數據交互新體驗

引言 在人工智能技術與車載算力持續突破的驅動下&#xff0c;現代車輛的數字化進程正加速推進。車聯網系統將突破傳統云端架構的局限&#xff0c;依托邊緣計算與 AI 融合技術&#xff0c;實現人車交互體驗的范式重構?。通過構建基于多源異構數據的自動化分析框架&#xff0c;…

Python數據可視化科技圖表繪制系列教程(三)

目錄 單一柱狀圖 分組柱狀圖 堆積柱狀圖 百分比柱狀圖 均值柱狀圖 不等寬柱狀圖 有序柱狀圖 條形圖 發散條形圖 在條上添加標簽的發散條形圖 基礎棒棒糖圖1 基礎棒棒糖圖2 【聲明】&#xff1a;未經版權人書面許可&#xff0c;任何單位或個人不得以任何形式復制、發…

JavaScript 數組與流程控制:從基礎操作到實戰應用

在 JavaScript 編程的世界里&#xff0c;數組是一種極為重要的數據結構&#xff0c;它就像是一個有序的 “收納盒”&#xff0c;能夠將多個值整齊地存儲起來。而流程控制語句則像是 “指揮官”&#xff0c;能夠按照特定的邏輯對數組進行遍歷和操作。接下來&#xff0c;就讓我們…

十(1). 強制類型轉換

繼第十部分C強制類型轉換的四種方式&#xff0c;再進行強化鞏固一下知識點 static_cast 最常用的&#xff0c;在指針之間做轉換 const_cast 去除常量屬性 dynamic_cast 用在基類和派生類之間的轉換 reinterpret_cast 在任意類型之間進行轉 10.1 static_cast 常見的使用場景&am…

Git版本控制工具詳解

如何區分開發環境和生產環境呢 答案就是寫不同的配置文件&#xff0c;開發的設置成開發需要的&#xff0c;生產的設置成生產需要的&#xff0c;共同放到config這個配置文件夾下面&#xff0c;開發和生成的時候分別加載不同的配置文件 方式二就是使用相同的一個入口配置文件&a…

反向傳播的核心是什么:計算損失函數對可訓練參數的梯度=== 損失函數能通過計算圖連接到可訓練參數

反向傳播的核心是什么:計算損失函數對可訓練參數的梯度 損失函數能通過計算圖連接到可訓練參數 在深度學習中,反向傳播的核心是計算損失函數對可訓練參數的梯度,從而更新這些參數。對于LLM(大型語言模型)而言,是否需要“LLM輸出的參數”才能進行反向傳播 一、反向傳播…

KINGCMS被入侵

現象會強制跳轉到 一個異常網站,請掉截圖代碼. 代碼中包含經過混淆處理的JavaScript&#xff0c;它使用了一種技術來隱藏其真實功能。代碼中使用了eval函數來執行動態生成的代碼&#xff0c;這是一種常見的技術&#xff0c;惡意腳本經常使用它來隱藏其真實目的。 這段腳本會檢…

深入探索串的高級操作:從算法到 LeetCode 實戰

串是編程中最常用的數據結構之一&#xff0c;從簡單的文本處理到復雜的文本匹配算法&#xff0c;串的應用無處不在。在掌握了串的基本概念、存儲結構以及KMP算法之后&#xff0c;現在讓我們深入探索串的更多高級操作&#xff0c;例如求子串、串的替換等&#xff0c;并通過LeetC…

在rocky linux 9.5上在線安裝 docker

前面是指南&#xff0c;后面是日志 sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo sudo dnf install docker-ce docker-ce-cli containerd.io -y docker version sudo systemctl start docker sudo systemctl status docker …

OneNet + openssl + MTLL

1.OneNet 使用的教程 1.在網絡上搜索onenet&#xff0c;注冊并且登錄賬號。 2.產品服務-----物聯網服務平臺立即體驗 3.在底下找到立即體驗進去 4.產品開發------創建產品 5.關鍵是選擇MQTT&#xff0c;其他的內容自己填寫 6.這里產品以及開發完成&#xff0c;接下來就是添加設…

【Fiddler工具判斷前后端Bug】

Fiddler工具判斷前后端Bug的方法 使用Fiddler抓包工具可以高效定位問題是出在前端還是后端&#xff0c;主要通過分析請求和響應的內容、狀態碼、數據格式等關鍵信息。 分析請求是否成功發送 檢查請求是否從客戶端正確發出&#xff0c;觀察Fiddler抓取的請求列表。若請求未出…

【論文閱讀筆記】《A survey on deep learning approaches for text-to-SQL》

文章目錄 一、論文基本信息1. 文章標題2. 所屬刊物/會議3. 發表年份4. 作者列表5. 發表單位 二、摘要三、解決問題四、創新點五、自己的見解和感想六、研究背景七、研究方法&#xff08;模型、實驗數據、評估指標&#xff09;八、總結&#xff08;做了什么、得到了什么、有什么…

【強連通分量 縮點 最長路 拓撲排序】P2656 采蘑菇|普及+

本文涉及知識點 C圖論 強連通分量 縮點 最長路 拓撲排序 P2656 采蘑菇 題目描述 小胖和 ZYR 要去 ESQMS 森林采蘑菇。 ESQMS 森林間有 N N N 個小樹叢&#xff0c; M M M 條小徑&#xff0c;每條小徑都是單向的&#xff0c;連接兩個小樹叢&#xff0c;上面都有一定數量的…

Dubbo Logback 遠程調用攜帶traceid

背景 A項目有調用B項目的服務&#xff0c;A項目使用 logback 且有 MDC 方式做 traceid&#xff0c;調用B項目的時候&#xff0c;traceid 沒傳遞過期&#xff0c;導致有時候不好排查問題和鏈路追蹤 準備工作 因為使用的是 alibaba 的 dubbo 所以需要加入單獨的包 <depend…

nodejs:用 nodemailer 發送一封帶有附件的郵件

我們將使用 nodemailer 庫來發送帶有附件的郵件。 首先&#xff0c;確保已經安裝了nodemailer。如果沒有安裝&#xff0c;可以通過 npm install nodemailer 來安裝。 cnpm install nodemailer --save dependencies: – nodemailer ^7.0.3 步驟&#xff1a; 引入nodemailer模…