堆排序思想分享

人不走空

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??

??????🌈個人主頁:人不走空??????

💖系列專欄:算法專題

?詩詞歌賦:斯是陋室,惟吾德馨

目錄

??????🌈個人主頁:人不走空??????

💖系列專欄:算法專題

?詩詞歌賦:斯是陋室,惟吾德馨

堆排序的基本思想

堆排序的步驟

代碼示例(Java)

代碼解釋

運行結果

堆排序的特點

總結

作者其他作品:


?

堆排序(Heap Sort)是一種基于堆數據結構的比較排序算法。堆是一棵完全二叉樹,具有堆屬性:對于最大堆,每個節點的值都大于或等于其子節點的值;對于最小堆,每個節點的值都小于或等于其子節點的值。堆排序利用了堆的這一特性來實現高效的排序。

堆排序的基本思想

堆排序的基本思想是先將待排序的數組構造成一個最大堆(或最小堆),然后通過不斷地取出堆頂元素(最大值或最小值),重建堆,從而完成排序。

堆排序的步驟

  1. 構建最大堆

    • 從數組的中間開始(即最后一個非葉子節點),向前遍歷,將每個節點和其子節點重新排列,使得整個數組符合最大堆的特性。
  2. 排序

    • 將堆頂元素(最大值)與數組末尾元素交換,這樣最大值就放到了最終的位置。
    • 將數組長度減 1(排除已經放置到最終位置的元素),重新調整堆,使其再次滿足最大堆的特性。
    • 重復上述步驟,直到整個數組有序。
代碼示例(Java)
public class HeapSort {public static void heapSort(int[] array) {int n = array.length;// 構建最大堆for (int i = n / 2 - 1; i >= 0; i--) {heapify(array, n, i);}// 一個一個從堆頂取出元素,放到已排序區域for (int i = n - 1; i > 0; i--) {// 交換當前堆頂元素和當前未排序部分的最后一個元素swap(array, 0, i);// 調整剩下的堆,長度減 1heapify(array, i, 0);}}private static void heapify(int[] array, int n, int i) {int largest = i;        // 假設當前節點 i 是最大值int left = 2 * i + 1;   // 左子節點索引int right = 2 * i + 2;  // 右子節點索引// 如果左子節點存在且大于當前節點,則更新 largestif (left < n && array[left] > array[largest]) {largest = left;}// 如果右子節點存在且大于當前節點,則更新 largestif (right < n && array[right] > array[largest]) {largest = right;}// 如果 largest 不是當前節點 i,交換它們并繼續調整if (largest != i) {swap(array, i, largest);heapify(array, n, largest);}}private static void swap(int[] array, int i, int j) {int temp = array[i];array[i] = array[j];array[j] = temp;}public static void main(String[] args) {int[] array = {12, 11, 13, 5, 6, 7};System.out.println("Original array: ");printArray(array);heapSort(array);System.out.println("Sorted array: ");printArray(array);}private static void printArray(int[] array) {for (int value : array) {System.out.print(value + " ");}System.out.println();}
}

代碼解釋

  1. heapSort 方法:這是堆排序的主方法。首先,通過 heapify 函數構建最大堆,然后不斷將堆頂元素移到數組末尾,調整剩余的堆。

  2. heapify 方法:調整以 i 為根的子樹,使其成為最大堆。它檢查 i 節點和其子節點的值,確保最大的值在 i 位置。如果 i 位置不是最大值,交換它和最大子節點的位置,并遞歸調整交換后的子樹。

  3. swap 方法:交換數組中兩個元素的位置。

  4. main 方法:演示如何使用 heapSort 方法排序一個整數數組,并打印排序前后的數組。

  5. printArray 方法:用于打印數組元素。

運行結果

Original array: 
12 11 13 5 6 7 
Sorted array: 
5 6 7 11 12 13 

堆排序的特點

  • 時間復雜度:堆排序在最壞、平均和最好情況下的時間復雜度均為 O(nlog?n)O(n \log n)O(nlogn)。
  • 空間復雜度:堆排序的空間復雜度為 O(1)O(1)O(1),因為它只需要常量級的額外空間。
  • 穩定性:堆排序不是穩定的排序算法,因為在排序過程中,元素的相對順序可能會改變。

總結

堆排序是一種高效的排序算法,尤其適用于大數據量的排序。它利用堆這種數據結構的特點,保證了較好的時間復雜度和低空間消耗。雖然它不如快速排序常用,但在需要穩定的性能和低空間開銷時,堆排序是一個不錯的選擇。


作者其他作品:

【Java】Spring循環依賴:原因與解決方法

OpenAI Sora來了,視頻生成領域的GPT-4時代來了

[Java·算法·簡單] LeetCode 14. 最長公共前綴 詳細解讀

【Java】深入理解Java中的static關鍵字

[Java·算法·簡單] LeetCode 28. 找出字a符串中第一個匹配項的下標 詳細解讀

了解 Java 中的 AtomicInteger 類

算法題 — 整數轉二進制,查找其中1的數量

深入理解MySQL事務特性:保證數據完整性與一致性

Java企業應用軟件系統架構演變史?

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

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

相關文章

丟失的數字(MissNumber)

丟失的數字 給定一個包含 [0, n] 中 n 個數的數組 nums &#xff0c;找出 [0, n] 這個范圍內沒有出現在數組中的那個數。 示例 1&#xff1a; 輸入&#xff1a;nums [3,0,1] 輸出&#xff1a;2 解釋&#xff1a;n 3&#xff0c;因為有 3 個數字&#xff0c;所以所有的數字都…

五、Pentium 微處理器保護模式存儲管理,《微機系統》第一版,趙宏偉

一、分段存儲管理 Pentium支持分段存儲管理、分頁存儲管理和段頁式存儲管理。 1.1 分段存儲管理的基本思想 一個程序由多個模塊組成。 每一個模塊都是一個特定功能的獨立的程序段。 段式管理&#xff1a;把主存按段分配的存儲管理方式。 程序模塊→段→段描述符→段描述符…

【設計】在Java后端開發時使用JSONObject完全替代JAVABean(DTO,VO)是否可行?

其實這樣做你是得不償失&#xff0c;不過也要看什么項目&#xff0c;如果你的項目只在只需要實現功能&#xff0c;不在乎健壯性&#xff0c;可持續性那就完全可以。因為我現在公司老項目所有用的POJO的地方都是用JSONObject。代碼可讀性幾乎為0。你用了可能喪失以下功能&#x…

【微服務】后臺管理項目多數據源管理方案實戰

目錄 前言 1、使用Spring提供的AbstractRoutingDataSource 2、使用MyBatis注冊多個SqlSessionFactory 3、使用dynamic-datasource框架 前言 Java后臺使用MyBatis-plus 快速訪問多個數 據源&#xff0c;這里分享三種常用的多數據源管理方案 1、使用Spring提供的AbstractRout…

【C++深度探索】繼承機制詳解(一)

hello hello~ &#xff0c;這里是大耳朵土土垚~&#x1f496;&#x1f496; &#xff0c;歡迎大家點贊&#x1f973;&#x1f973;關注&#x1f4a5;&#x1f4a5;收藏&#x1f339;&#x1f339;&#x1f339; &#x1f4a5;個人主頁&#xff1a;大耳朵土土垚的博客 &#x1…

代碼托管服務:GitHub、GitLab、Gitee

目錄 引言GitHub&#xff1a;全球最大的代碼托管平臺概述功能特點適用場景 GitLab&#xff1a;一體化的開發平臺概述功能特點適用場景 Gitee&#xff08;碼云&#xff09;&#xff1a;中國本土化的代碼托管服務概述功能特點適用場景 功能對比結論 引言 在現代軟件開發中&#…

numpy - array(3)

arr1 np.array([[(1000, 1001, 1002, 1003), (1010, 1011, 1012, 1013), (1020, 1021, 1022, 1023)],[(1100, 1101, 1102, 1103), (1110, 1111, 1112, 1113), (1120, 1121, 1122, 1123)]], dtypeint) (1) 根據坐標訪問元素或內容,更改訪問的內容&#xff0c;array也會更改。“…

C++操作系列(一):MinGW環境安裝與配置(無報錯版)

本文選擇MinGW作為安裝對象。 1. 下載MinGW 進入官網&#xff1a;MinGW - Minimalist GNU for Windows download | SourceForge.net 點擊File&#xff1a; 劃到最下面&#xff1a; &#xfeff; Windows 64位系統下載seh結尾的安裝包&#xff1a; 2. 安裝MinGW 解壓MinGW&am…

力扣第218題“天際線問題”

在本篇文章中&#xff0c;我們將詳細解讀力扣第218題“天際線問題”。通過學習本篇文章&#xff0c;讀者將掌握如何使用掃描線算法和堆來解決這一問題&#xff0c;并了解相關的復雜度分析和模擬面試問答。每種方法都將配以詳細的解釋&#xff0c;以便于理解。 問題描述 力扣第…

【CSS】深入理解CSS 的steps()函數

在CSS動畫中&#xff0c;steps()函數是一個時間函數&#xff0c;它主要用于animation-timing-function屬性&#xff0c;以定義動畫的步進方式。當你想要動畫的某個屬性&#xff08;如background-position或transform: translateX()&#xff09;在特定的步驟之間變化時&#xff…

探索 ES6:現代 JavaScript 的新特性

隨著 JavaScript 的不斷演進&#xff0c;ECMAScript 2015&#xff08;簡稱 ES6&#xff09;作為 JavaScript 的一次重大更新&#xff0c;帶來了許多新特性和語法改進&#xff0c;極大地提升了開發體驗和代碼質量。本文將詳細介紹 ES6 的主要新特性&#xff0c;并展示如何在實際…

NLTK:原理與使用詳解

文章目錄 NLTK簡介NLTK的核心功能1. 文本處理2. 詞匯處理3. 語法分析4. 語義分析5. 情感分析 NLTK的使用1. 安裝NLTK2. 導入NLTK庫3. 下載NLTK數據集4. 文本處理示例5. 情感分析示例 總結 NLTK簡介 NLTK是一個開源的Python庫&#xff0c;用于處理和分析人類語言數據。它提供了…

扛鼎中國AI搜索,天工憑什么?

人類的創作不會沒有瓶頸&#xff0c;但AI的熱度可不會消停。 大模型之戰依舊精彩&#xff0c;OpenAI選擇在Google前一天舉行發布會&#xff0c;兩家AI企業之間的拉扯賺足了熱度。 反觀國內&#xff0c;百模大戰激發了大家對于科技變革的熱切期盼&#xff0c;而如今行業已逐漸…

【操作系統期末速成】 EP01 | 學習筆記(基于五道口一只鴨)

文章目錄 一、前言&#x1f680;&#x1f680;&#x1f680;二、正文&#xff1a;??????1.1 考點一&#xff1a;操作系統的概率及特征 三、總結&#xff1a;&#x1f353;&#x1f353;&#x1f353; 一、前言&#x1f680;&#x1f680;&#x1f680; ?? 回報不在行動…

文章浮現之單細胞VDJ的柱狀圖

應各位老師的需求復現一篇文章的中的某個圖 具體復現圖5的整個思路圖&#xff0c;這里沒有原始數據&#xff0c;所以我使用虛擬生產的metadata進行畫圖 不廢話直接上代碼&#xff0c;先上python的代碼的結果圖 import matplotlib.pyplot as plt import numpy as np# 數據&#…

架構師篇-8、運用事件風暴進行業務領域建

如何成為優秀架構師&#xff1f; 需要有一定的技術積累&#xff0c;但是核心是懂業務。 具備一定的方法&#xff0c;并且有很強的業務理解能力。 技術架構師&#xff1a;形成技術方案&#xff0c;做的更多的是底層的平臺&#xff0c;提供工具。 業務架構師&#xff1a;解決方…

兩數之和你會,三數之和你也會嗎?o_O

前言 多少人夢想開始的地方&#xff0c;兩數之和。 但是今天要聊的不是入門第一題&#xff0c;也沒有面試官會考這一題吧…不會真有吧&#xff1f; 咳咳不管有沒有&#xff0c;今天的豬腳是它的兄弟&#xff0c;三數之和&#xff0c;作為雙指針經典題目之一&#xff0c;也是常…

Vue3中Element Plus組件庫el-eialog彈框中的input無法獲取表單焦點的解決辦法

以下是vue.js官網給出的示例 <script setup> import { ref, onMounted } from vue// 聲明一個 ref 來存放該元素的引用 // 必須和模板里的 ref 同名 const input ref(null)onMounted(() > {input.value.focus() }) </script><template><input ref&qu…

如何在Vue3項目中使用Pinia進行狀態管理

**第一步&#xff1a;安裝Pinia依賴** 要在Vue3項目中使用Pinia進行狀態管理&#xff0c;首先需要安裝Pinia依賴。可以使用以下npm命令進行安裝&#xff1a; bash npm install pinia 或者如果你使用的是yarn&#xff0c;可以使用以下命令&#xff1a; bash yarn add pinia *…

Tomcat的安裝和虛擬主機和context配置

一、 安裝Tomcat 注意&#xff1a;安裝 tomcat 前必須先部署JDK 1. 安裝JDK 方法1&#xff1a;Oracle JDK 的二進制文件安裝 [rootnode5 ~]# mkdir /data [rootnode5 ~]# cd /data/ [rootnode5 data]# rz[rootnode5 data]# ls jdk-8u291-linux-x64.tar.gz [rootnode5 data]…