【數據結構?堆】堆排序(理論基礎)

堆的定義
 ? 堆是一個完全二叉樹
  –所有葉子在同一層或者兩個連續層
  –最后一層的結點占據盡量左的位置
 ? 堆性質
  –為空, 或者最小元素在根上
  –兩棵子樹也是堆

存儲方式
 ? 最小堆的元素保存在heap[1..hs]內
  – 根在heap[1]
  –K的左兒子是2k, K的右兒子是2k+1,
  –K的父親是[k/2]

1557927243672469506.bmp

刪除最小值元素
 ? 三步法
  – 直接刪除根
  – 用最后一個元素代替根上元素
  – 向下調整

1557927310072496130.bmp

 ? 首先選取當前結點p的較小兒子,如果比p大, 調整停止;否則交換p和兒子, 繼續調整

1557927360928432129.bmp

插入元素和向上調整
 ? 插入元素是先添加到末尾, 再向上調整
 ? 向上調整: 比較當前結點p和父親, 如果父親比p小,停止; 否則交換父親和p, 繼續調整

堆的建立(堆的構造)
  1、自底向上堆構造算法:
  在初始化一棵包含幾個節點的完全二叉樹時,按給定的順序來效置鍵;然后按照下面的方法對樹進行“堆化”(如下圖)從最后的父母節點開始,到根為止,該算法檢查這些節點的鍵是否滿足父母優勢要求。如果該節點不滿足,該算法把節點的鍵k和它子女的最大鍵進行交換,然后再檢查在新位置上,k是不是滿足父母優勢要求。這個過程一直繼續到對k的父母優勢要求滿足為止,對于以當前父母節點為根的子樹,在完成了它“堆化”以后,該算法對于該節點的直接前趨進行同樣的操作。在對樹的根完成了這種操作以后,該算法就停止了。 ? ?
?

1557927465840558082.bmp

  2、自頂向下堆構造算法:
  通過把新的鍵連續插入預先構造好的堆,來構造一個新堆,如何把一個新的鍵k插入到堆中呢?首先,把一個包含鍵k的新節點附加在當前堆的最后一個葉子后面,然后按照下面的方法把k篩選到它的適當位置,拿k和它父母的鍵作比較,如果后者大于等于k,算法停止;否則,交換這兩個鍵并把k和它的新父母做比較。這種交換一直持續到k不大于它的最后一個父母,或者是達到了樹的根為止(如下圖)。在這個算法中,我們也可以把一個空節點向上篩選,直到達到合適的位置,才把k的值賦予它。

1557927540822130689.bmp

  顯然,這個插入操作所需的鍵值比較次數不可能超過堆的高度。因為包含幾個節點的堆的高度大約是log2n所以插入的時間效率屬于o(logn)。

刪除堆中某個元素(不一定是堆頂元素)
  1、以堆中最后一個元素取代被刪除元素留下的空位(此舉確保堆首先是一個完全二叉樹)。
  2、堆調整(堆化)。

時間復雜度分析
 ? 向上調整/向下調整
  – 每層是常數級別, 共logn層, 因此為:O(logn)
 ? 插入/刪除
  – 只調用一次向上或向下調整, 因此都是:O(logn)
 ? 建堆
  – 高度為h的結點有n/2h+1個,總時間為:O(n*logn)

【堆,這種數據結構適合解決何種類型的問題?】
  ???........
  D$#@&(<):>M"|{_#!@SAQ$&GBD^KFG(*&$#$BK}{?<:>"X~@^


===========================================


【堆排序實踐】

  輸入n個整數( n <= 10^5),按從大到小排序后輸出。
  操作步驟:
   1) 建立堆。(直接在待排序數據A[]上建立最大堆)
   2) 重復調整堆。取出堆首元素(根元素),交換至堆尾部,堆容量減1,繼續調整。

優秀范例代碼展示(構架清晰、代碼簡潔、高效!)

輸入輸出格式

輸入格式:

  二行,第一行,一個整數值n( n <= 10^5 );第二行,n個整數,每個整數均小于2^31,每個整數間有一個空格間隔。

輸出格式:

  一行,排好序(從大到小的順序!!)的n個數據,每個數據間用一個空格間隔。

輸入輸出樣例

輸入樣例#1:

4
4 5 2 897

輸出樣例#1:

897 5 4 2

提示信息

如果僅僅為了AC,那么排序吧!

sort也有一定概率堆排

#include<bits/stdc++.h>
#define sp sort
using namespace std;
int n,a[100010];
int cmp(int x,int y)
{return x>y;
}
int main()
{cin>>n;for(int i=1;i<=n;i++){cin>>a[i];}sp(a+1,a+n+1,cmp);for(int i=1;i<=n;i++){cout<<a[i]<<" ";}return 0;
}

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

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

相關文章

細胞——求細胞數量 C++詳解

細胞——求細胞數量 C詳解 求細胞數量題目描述輸入格式輸出格式樣例樣例輸入樣例輸出 提示數據規模與約定 解法代碼 求細胞數量 題目描述 一矩形陣列由數字 0 0 0 到 9 9 9 組成&#xff0c;數字 1 1 1 到 9 9 9 代表細胞&#xff0c;細胞的定義為沿細胞數字上下左右若還…

vue3中使用component動態組件常見問題

一. 在vue3中使用動態組件問題警告處理 1. 代碼如下 <template><div v-for"(item, index) in navItems" :key"index"><component :is"item.component" :key"item.gameId"></component></div> </te…

nbcio-boot升級springboot、mybatis-plus和JSQLParser后的LocalDateTime日期json問題

升級后&#xff0c;運行顯示項目的時候出現下面錯誤 2023-08-12 10:57:39.174 [http-nio-8080-exec-3] [1;31mERROR[0;39m [36morg.jeecg.common.aspect.DictAspect:104[0;39m - json解析失敗Java 8 date/time type java.time.LocalDateTime not supported by default: add Mo…

Leetcode-每日一題【劍指 Offer 26. 樹的子結構】

題目 輸入兩棵二叉樹A和B&#xff0c;判斷B是不是A的子結構。(約定空樹不是任意一個樹的子結構) B是A的子結構&#xff0c; 即 A中有出現和B相同的結構和節點值。 例如: 給定的樹 A: 3 / \ 4 5 / \ 1 2 給定的樹 B&#xff1a; 4 / 1 返回 true&#xff0…

ffmpeg ts列表合并為mp4

操作系統&#xff1a;ubuntu 注意事項&#xff1a; 1.ts文件順序必須正確&#xff0c;也就是下一幀的dst和pst要比上一幀的大&#xff0c;否則會報錯 2.codecpar->codec_tag要設置為0&#xff0c;否則報錯Tag [27][0][0][0] incompatible with output codec id ‘27’ (avc1…

docker版jxTMS使用指南:使用jxTMS采集數據之二

本文是如何用jxTMS進行數據采集的第二部分&#xff0c;整個系列的文章請查看&#xff1a;docker版jxTMS使用指南&#xff1a;4.4版升級內容 docker版本的使用&#xff0c;請查看&#xff1a;docker版jxTMS使用指南 4.0版jxTMS的說明&#xff0c;請查看&#xff1a;4.0版升級內…

Vue + MapBox快速搭建

一、說明&#xff1a; 1.mapbox-gl自2.0版本開始不再開源&#xff0c;需要用戶在官網申請key使用。 2.maplibre GL JS是一個開源庫&#xff0c;它起源于 mapbox-gl-js 的開源分支。該庫的初始版本&#xff08;1.x&#xff09;旨在替代Mapbox的OSS版本。簡單來說maplibre是mapb…

異步場景加載詳解

異步場景加載詳解 介紹 異步場景加載是一種在Unity中加載場景的方式&#xff0c;它允許在加載過程中執行其他操作&#xff0c;并提供了加載進度的反饋。通過異步加載&#xff0c;可以避免加載大型場景時的卡頓現象&#xff0c;提高游戲的流暢性和用戶體驗。 方法 在Unity中…

C++——缺省參數

缺省參數的定義 缺省參數是聲明或定義函數時為函數的參數指定一個缺省值。在調用該函數的時候&#xff0c;如果沒有指定實參&#xff0c;則采用該形參的缺省值&#xff0c;否則使用指定的實參。 void Func(int a 0) {cout << a << endl; } int main() { Func()…

【Kubernetes】Kubernetes之Pod詳解

Pod 一、 Pod1. Pod 基礎概念2. 在 Kubrenetes 集群中 Pod 使用方式2.1 pasue 容器2.2 kubernetes 中的 pause 容器提供的功能 3. Pod 的概念和結構組成4. Pod 的分類5. Pod 容器的分類5.1 基礎容器&#xff08;infrastructure container&#xff09;5.2 初始化容器&#xff08…

07 |「異步任務」

前言 實踐是最好的學習方式&#xff0c;技術也如此。 文章目錄 前言一、進程與線程1、進程2、線程 二、實現三、異步任務加載器 一、進程與線程 1、進程 進程(Process)是操作系統分配資源的基本單位,它是一個執行中的程序實例&#xff1b;每個進程都有自己獨立的內存空間,不同…

【大數據】Flink 詳解(二):核心篇 Ⅲ

Flink 詳解&#xff08;二&#xff09;&#xff1a;核心篇 Ⅲ 29、Flink 通過什么實現可靠的容錯機制&#xff1f; Flink 使用 輕量級分布式快照&#xff0c;設計檢查點&#xff08;checkpoint&#xff09;實現可靠容錯。 30、什么是 Checkpoin 檢查點&#xff1f; Checkpoint …

百度 amis 當成 UI 庫用

百度 amis 當成 UI 庫用 1.獲取到這些 amis 對外提供的方法 var amisLib amisRequire(amis);// 獲取到這些 amis 對外提供的方法。 2.js中使用百度amis中 confirm var name"name";amisLib.confirm(請確認刪除 name !,"刪除").then((confirmed) > {if…

如何進行游戲平臺搭建?

游戲平臺搭建涉及多個步驟和技術&#xff0c;下面是一個大致的指南&#xff1a; 市場調研和定位&#xff1a;首先&#xff0c;要了解游戲市場和受眾的需求&#xff0c;選擇適合的游戲類型和定位。 選擇平臺類型&#xff1a;決定是要搭建網頁平臺、移動應用平臺還是其他類型的…

群暉6.X便捷的安裝cpolar內網穿透

群暉6.X便捷的安裝cpolar內網穿透 文章目錄 群暉6.X便捷的安裝cpolar內網穿透前言1. 下載cpolar的群暉套件1.1 打開群暉套件中心1.2 選擇“手動安裝”1.3 選擇下載cpolar套件位置 2. 打開cpolar的Web-UI界面3. 注冊會員 前言 隨著硬件設備和軟件技術的發展&#xff0c;以及數據…

概率圖模型(Probabilistic Graphical Model,PGM)

概率圖模型&#xff08;Probabilistic Graphical Model&#xff0c;PGM&#xff09;&#xff0c;是一種用圖結構來描述多元隨機變量之間條件獨立性的概率模型。它可以用來表示復雜的概率分布&#xff0c;進行有效的推理和學習&#xff0c;以及解決各種實際問題&#xff0c;如圖…

Redis小例子

MAC電腦下Redis的安裝&#xff1a; brew install redis下面給一個Java操作redis的小例子 import redis.clients.jedis.Jedis;public class Demo {public static void main(String[] args) {// 創建 Jedis 客戶端實例&#xff0c;連接到本地 Redis 服務器&#xff0c;默認端口…

RedisDesktopManage

RDM 簡介下載安裝 簡介 RedisDesktopManager&#xff08;RDM&#xff09;是一個開源的跨平臺圖形界面工具&#xff0c;用于管理和操作 Redis 數據庫。它提供了一個用戶友好的界面&#xff0c;使用戶能夠輕松地連接、瀏覽、查詢和修改 Redis 數據&#xff0c;而無需使用命令行界…

教你10分鐘內學習如何CSS 設置網頁打印時的樣式

本文將教您開始為要打印的頁面編寫CSS所需要的一切提供幫助。 media 規則 If you’ve done any responsive design, you’ll already know about the media rule. As well as different screen sizes, media also lets you target “print” media. Here’s an example: 如果…

競賽項目 深度學習的動物識別

文章目錄 0 前言1 背景2 算法原理2.1 動物識別方法概況2.2 常用的網絡模型2.2.1 B-CNN2.2.2 SSD 3 SSD動物目標檢測流程4 實現效果5 部分相關代碼5.1 數據預處理5.2 構建卷積神經網絡5.3 tensorflow計算圖可視化5.4 網絡模型訓練5.5 對貓狗圖像進行2分類 6 最后 0 前言 &#…