關于堆排序

今天我們不刷力扣了,我們來復習(手撕)一下數據結構中的八大排序算法之一,堆排序

基本概念:

? ? ?堆是一種特殊的樹形數據結構,即完全二叉樹。

堆分為大頂堆和小頂堆:

大頂堆:每個節點的值都大于或等于其兩個子節點的值,在堆排序算法中用于升序排序。

小頂堆:每個節點的值都小于或等于其兩個子節點的值,在堆排序算法中用于降序排序。

映射為數組:

代碼實現:

    //堆排序public static void heapSort(int[] arr) {//構造大根堆heapInsert(arr);int size = arr.length;while (size > 1) {//固定最大值swap(arr, 0, size - 1);size--;//構造大根堆heapify(arr, 0, size);}}//構造大根堆(通過新插入的數上升)public static void heapInsert(int[] arr) {for (int i = 0; i < arr.length; i++) {//當前插入的索引int currentIndex = i;//父結點索引int fatherIndex = (currentIndex - 1) / 2;//如果當前插入的值大于其父結點的值,則交換值,并且將索引指向父結點//然后繼續和上面的父結點值比較,直到不大于父結點,則退出循環while (arr[currentIndex] > arr[fatherIndex]) {//交換當前結點與父結點的值swap(arr, currentIndex, fatherIndex);//將當前索引指向父索引currentIndex = fatherIndex;//重新計算當前索引的父索引fatherIndex = (currentIndex - 1) / 2;}}}//將剩余的數構造成大根堆(通過頂端的數下降)public static void heapify(int[] arr, int index, int size) {int left = 2 * index + 1;int right = 2 * index + 2;while (left < size) {int largestIndex;//判斷孩子中較大的值的索引(要確保右孩子在size范圍之內)if (arr[left] < arr[right] && right < size) {largestIndex = right;} else {largestIndex = left;}//比較父結點的值與孩子中較大的值,并確定最大值的索引if (arr[index] > arr[largestIndex]) {largestIndex = index;}//如果父結點索引是最大值的索引,那已經是大根堆了,則退出循環if (index == largestIndex) {break;}//父結點不是最大值,與孩子中較大的值交換swap(arr, largestIndex, index);//將索引指向孩子中較大的值的索引index = largestIndex;//重新計算交換之后的孩子的索引left = 2 * index + 1;right = 2 * index + 2;}}//交換數組中兩個元素的值public static void swap(int[] arr, int i, int j) {int temp = arr[i];arr[i] = arr[j];arr[j] = temp;}

算法思路:

排序步驟:?

? ? ? 1.構造一個大頂堆(或小頂堆),取堆頂數字(也就是最大值或最小值)

? ? ? ? 2.再將剩下的數字構建一個大頂堆(或小頂堆),取堆頂數字(也就是剩下值當中的最大值(或最小值))

? ? ? ? 3.重復以上操作,直到取完堆中的數字,最后得到一個從大到小(或從小到大)排序的序列

基本思路:

將所有元素構成一個堆的形式,然后比較每一個二叉樹,將最大的或最小的與根節點元素互換位置,最后將最頂根節點取出,再從左到右、從下到上的方式將尾節點放到最頂根節點上,再重復上述操作進行排序取出最大或最小元素,以此類推,直到所有元素取出。

?

平均時間復雜度:O(n*{log_{2}}^{n}

學習參考:?

堆排序算法(圖解詳細流程)-CSDN博客

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

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

相關文章

OrangePi KunPengPro | 開發板開箱測評之學習與使用

OrangePi KunPengPro | 開發板開箱測評之學習與使用 時間&#xff1a;2024年5月23日20:51:12 文章目錄 OrangePi KunPengPro | 開發板開箱測評之學習與使用概述1.參考2.資料、工具3.使用3-1.通過串口登錄系統3-2.通過SSH登錄系統3-3.安裝交叉編譯工具鏈3-4.復制文件到設備3-5.第…

【組合數學】常考試題答案

一、單項選擇題&#xff08;每小題3分&#xff0c;共15分&#xff09; 1. 用3個“1”和4個“0”能組成&#xff08; &#xff09;個不同的二進制數字。 A. 35 B. 36, C. 37, D. 38 2. 整除300的正整數的個數為&#xff08;  &#xff09;。 A. 14…

Anaconda+CUDA+CUDNN+Pycharm+Pytorch安裝教程(第一節 Anconda安裝)

1.選擇和對應的anconda版本 官網地址&#xff1a;Index of / (anaconda.com) 下載地址&#xff1a;Index of /anaconda/archive/ | 清華大學開源軟件鏡像站 | Tsinghua Open Source Mirror 2.安裝流程 (1)下載安裝包 (2)點擊next &#xff08;3&#xff09;點擊I agree &a…

解決Flutter位于懸浮窗口時,應用Logo不更新問題

問題描述 我已經更換了應用Logo&#xff0c;但是發現應用處于懸浮窗口時&#xff0c;logo還是更改之前的&#xff1f;下面的圖片只是示意。 解決方案 終端命令 rm -rf ~/Library/Developer/Xcode/DerivedData2.xcode視圖內解決 先在頂部找到 Xcode --> Setting --> Lo…

操作系統入門系列-MIT6.828(操作系統工程)學習筆記(二)----課程實驗環境搭建(wsl2+ubuntu+quem+xv6)

MIT6.S081&#xff08;操作系統&#xff09;學習筆記 操作系統入門系列-MIT6.828&#xff08;操作系統&#xff09;學習筆記&#xff08;一&#xff09;---- 操作系統介紹與接口示例 操作系統入門系列-MIT6.828&#xff08;操作系統工程&#xff09;學習筆記&#xff08;二&am…

Java面向對象-常用類(日期時間類)

常用類-日期時間類 Date&#xff08;java.util.Date&#xff09; – 日期類 SimpleDateFormat – 格式化日期類 Calendar – 日歷類 1 Date類 java.util.Date類表示特定的瞬間&#xff0c;精確到毫秒。 package com.qf.datetime;import java.util.Date;public class Test01 {…

ubantu20.04 跑通ros2版的orbslam2

我的歷程 先編譯的非ros版的robslam2&#xff08;非常詳細&#xff09; ubuntu20.04配置并編譯ORB-SLAM2_ubuntu20.04安裝orb-lslam2-CSDN博客 然后裝ros2&#xff08;非常詳細&#xff09; 詳細介紹如何在ubuntu20.04中安裝ROS系統&#xff0c;超快完成安裝&#xff08;最…

C#解析xml文件

1、示例 <?xml version"1.0" encoding"utf-8" standalone"no"?><DATA><ITEMS><ITEM><ID>01<ID/><CODE>0001<CODE><NAME>測試1<NAME/></ITEM><ITEM><ID>02<…

福昕PDF編輯器自定義快捷方式

你是否為用不慣福昕PDF編輯器自帶的快捷鍵而發愁&#xff1f;今天&#xff0c;我和大家分享一下如何設置自己想要的快捷鍵方式&#xff0c;希望能對大家有幫助。 步驟一&#xff1a;打開福昕PDF編輯&#xff0c;并找到更多命令 步驟二&#xff1a;切換到鍵盤一欄&#xff0c;并…

分布式專題

一&#xff1a;分布式事務 1、理論基礎 分布式事務主要區分本地事務 什么是本地事務&#xff08;Local Transaction&#xff09;&#xff1f;本地事務也稱為數據庫事務或傳統事務&#xff08;相對于分布式事務而言&#xff09;。尤其對于數據庫而言&#xff0c;為了數據安全…

Android 多張圖片合成GIF

直接用嗶哩嗶哩弄的一個庫&#xff0c;傳送門&#xff1a;https://github.com/bilibili/BurstLinker 他那個庫的文檔寫的比較簡陋&#xff0c;所以我決定&#xff0c;我也寫得十分簡陋 引用&#xff1a; api com.bilibili:burst-linker:0.0.13 使用&#xff1a; /*** param i…

Docker快速搭建Oracle服務

服務器&#xff1a;CentOS7.9 1.安裝docker yum install -y docker 2. 設置鏡像加速 修改 /etc/docker/daemon.json 文件并添加上 registry-mirrors 鍵值 阿里云的docker鏡像需要自己注冊賬號&#xff0c;也可以不注冊賬號&#xff0c;直接使用下面的連接。 也可以寫入多…

【C++ 】學習問題及補充

一.自定義類型不初始化直接就賦值&#xff0c;比如string類會怎么樣 vectr<string>里已經給每個string對象已經分配好空間&#xff0c;為什么不初始化再賦值會報錯 在C中&#xff0c;std::string類是一個動態字符串類&#xff0c;它內部管理著一個字符數組&#xff0c;用…

2024東北四省賽——M House

cf上有題解&#xff0c;我寫這個只想說真服了&#xff0c;卡double了導致一直沒做出來 開long double過的 貼一下我的代碼 #include <bits/stdc.h>using namespace std; typedef long double LD; typedef long long LL; #define int LL #define double LD const int N …

【藍橋杯】國賽普及-

題目列表 - 洛谷 | 計算機科學教育新生態 (luogu.com.cn) P9420 [藍橋杯 2023 國 B] 子 2023 / 雙子數 - 洛谷 | 計算機科學教育新生態 (luogu.com.cn) #include<bits/stdc.h> using llunsigned long long; #define int ll const int N2e510; int k0; std::string s; int…

【傳知代碼】無監督動畫中關節動畫的運動表示-論文復現

文章目錄 概述動畫技術的演進原理介紹核心邏輯環境配置/部署方式小結 本文涉及的源碼可從無監督動畫中關節動畫的運動表示該文章下方附件獲取 概述 該文探討了動畫在教育和娛樂中的作用&#xff0c;以及通過數據驅動方法簡化動畫制作的嘗試。近期研究通過無監督運動轉移減少對…

Java進階學習筆記30——BigDecimal

BigDecimal&#xff1a; 用于解決浮點型運算的&#xff0c;出現結果失真的問題。 運行結果&#xff1a; package cn.ensource.d4_bigdecimal;import java.math.BigDecimal;public class Test {public static void main(String[] args) {// 目標&#xff1a;了解BigDecimal類do…

RustGUI學習(iced/iced_aw)之擴展小部件(二十七):如何使用number_input部件?

前言 本專欄是學習Rust的GUI庫iced的合集,將介紹iced涉及的各個小部件分別介紹,最后會匯總為一個總的程序。 iced是RustGUI中比較強大的一個,目前處于發展中(即版本可能會改變),本專欄基于版本0.12.1. 概述 這是本專欄的第二十七篇,主要講述number_input部件的使用,會…

8、Qt—Log4Qt使用小記2(每日產生文件)

前言&#xff1a; 開發平臺&#xff1a;Win10 64位 開發環境&#xff1a;Qt Creator 13.0.0 構建環境&#xff1a;Qt 5.15.2 MSVC2019 64位 例如&#xff1a;上一篇文章中筆者記錄了Log4qt的編譯及配置使用&#xff0c;這篇文章重點寫下每天產生文件到指定文件夾中&#xff0c;…

5.1 Go 函數的定義與調用

&#x1f49d;&#x1f49d;&#x1f49d;歡迎蒞臨我的博客&#xff0c;很高興能夠在這里和您見面&#xff01;希望您在這里可以感受到一份輕松愉快的氛圍&#xff0c;不僅可以獲得有趣的內容和知識&#xff0c;也可以暢所欲言、分享您的想法和見解。 推薦:「stormsha的主頁」…