Java實現堆排序算法

?

?

1. 堆排序原理圖解

?

堆排序是一種基于二叉堆(通常使用最大堆)的排序算法。其核心思想是利用堆的性質(父節點的值大于或等于子節點的值)來高效地進行排序。堆排序分為兩個主要階段:建堆和排序。

?

堆排序步驟:

?

1. 建堆:

? ?- 將無序數組構建成一個最大堆。

? ?- 從最后一個非葉子節點開始,逐個調整節點,使其滿足堆的性質。

?

2. 排序:

? ?- 將堆頂元素(最大值)與堆的最后一個元素交換。

? ?- 縮小堆的范圍,重新調整堆,使其滿足最大堆的性質。

? ?- 重復上述過程,直到堆的大小為1。

?

圖解示例:

?

假設數組為 `[4, 10, 3, 5, 1]`。

?

1. 初始狀態:`[4, 10, 3, 5, 1]`

2. 建堆:

? ?- 調整節點,構建最大堆:`[10, 5, 3, 4, 1]`

3. 排序過程:

? ?- 將堆頂元素(10)與最后一個元素(1)交換:`[1, 5, 3, 4, 10]`

? ?- 調整剩余的堆(`[1, 5, 3, 4]`),使其滿足最大堆的性質:`[5, 4, 3, 1]`

? ?- 將堆頂元素(5)與最后一個元素(1)交換:`[1, 4, 3, 5, 10]`

? ?- 調整剩余的堆(`[1, 4, 3]`),使其滿足最大堆的性質:`[4, 1, 3]`

? ?- 將堆頂元素(4)與最后一個元素(3)交換:`[3, 1, 4, 5, 10]`

? ?- 調整剩余的堆(`[3, 1]`),使其滿足最大堆的性質:`[3, 1]`

? ?- 將堆頂元素(3)與最后一個元素(1)交換:`[1, 3, 4, 5, 10]`

4. **最終結果**:`[1, 3, 4, 5, 10]`

?

?2. Java代碼實現及注釋

?

```java

import java.util.Arrays;

?

public class HeapSort {

? ? public static void main(String[] args) {

? ? ? ? int[] array = {4, 10, 3, 5, 1};

? ? ? ? heapSort(array);

? ? ? ? System.out.println("排序后的數組:");

? ? ? ? System.out.println(Arrays.toString(array));

? ? }

?

? ? // 堆排序主方法

? ? public static void heapSort(int[] arr) {

? ? ? ? int n = arr.length;

?

? ? ? ? // 建堆:從最后一個非葉子節點開始,逐個調整節點

? ? ? ? for (int i = n / 2 - 1; i >= 0; i--) {

? ? ? ? ? ? heapify(arr, n, i);

? ? ? ? }

?

? ? ? ? // 排序:交換堆頂元素與最后一個元素,然后調整堆

? ? ? ? for (int i = n - 1; i >= 0; i--) {

? ? ? ? ? ? // 交換堆頂元素與最后一個元素

? ? ? ? ? ? int temp = arr[0];

? ? ? ? ? ? arr[0] = arr[i];

? ? ? ? ? ? arr[i] = temp;

?

? ? ? ? ? ? // 調整剩余的堆

? ? ? ? ? ? heapify(arr, i, 0);

? ? ? ? }

? ? }

?

? ? // 調整堆的方法

? ? private static void heapify(int[] arr, int heapSize, int rootIndex) {

? ? ? ? int largest = rootIndex; // 假設根節點是最大的

? ? ? ? int leftChild = 2 * rootIndex + 1; // 左子節點

? ? ? ? int rightChild = 2 * rootIndex + 2; // 右子節點

?

? ? ? ? // 如果左子節點大于根節點

? ? ? ? if (leftChild < heapSize && arr[leftChild] > arr[largest]) {

? ? ? ? ? ? largest = leftChild;

? ? ? ? }

?

? ? ? ? // 如果右子節點大于當前最大的節點

? ? ? ? if (rightChild < heapSize && arr[rightChild] > arr[largest]) {

? ? ? ? ? ? largest = rightChild;

? ? ? ? }

?

? ? ? ? // 如果最大的節點不是根節點,交換它們

? ? ? ? if (largest != rootIndex) {

? ? ? ? ? ? int temp = arr[rootIndex];

? ? ? ? ? ? arr[rootIndex] = arr[largest];

? ? ? ? ? ? arr[largest] = temp;

?

? ? ? ? ? ? // 遞歸調整子樹

? ? ? ? ? ? heapify(arr, heapSize, largest);

? ? ? ? }

? ? }

}

```

?

?3. 代碼說明

?

1. 建堆:

? ?- 從最后一個非葉子節點開始,逐個調整節點,使其滿足最大堆的性質。

? ?- 使用 `heapify` 方法調整節點。

?

2. 排序:

? ?- 將堆頂元素(最大值)與堆的最后一個元素交換。

? ?- 縮小堆的范圍,重新調整堆,使其滿足最大堆的性質。

? ?- 重復上述過程,直到堆的大小為1。

?

3. 時間復雜度:

? ?- **最壞情況**:`O(n log n)`。

? ?- **平均情況**:`O(n log n)`。

? ?- **最好情況**:`O(n log n)`。

?

4. 空間復雜度:

? ?- `O(1)`,因為堆排序是原地排序算法,不需要額外的存儲空間。

?

5. 穩定性:

? ?- 堆排序是**不穩定的**,因為交換操作可能改變相同值元素的相對順序。

?

4. 應用場景

?

1. 大規模數據排序:

? ?- 堆排序的時間復雜度為 `O(n log n)`,適合對大規模數據進行排序。

?

2. 優先隊列實現:

? ?- 堆排序的核心思想可以用于實現優先隊列,例如在任務調度中。

?

3. 教學和演示:

? ?- 堆排序的實現清晰,適合用于教學和算法演示。

?

?5. 總結

?

堆排序是一種高效的排序算法,基于二叉堆的性質實現。它的時間復雜度穩定在 `O(n log n)`,并且是原地排序算法,不需要額外的存儲空間。然而,堆排序是不穩定的,因此在需要保持相同值元素相對順序的場景中不適用。在實際應用中,堆排序常用于大規模數據排序和優先隊列的實現。

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

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

相關文章

【Hive入門】Hive安全管理與權限控制:審計日志全解析,構建完善的操作追蹤體系

目錄 引言 1 Hive審計日志概述 1.1 審計日志的核心價值 1.2 Hive審計日志類型 2 HiveServer2操作日志配置 2.1 基礎配置方案 2.2 日志格式解析 2.3 日志輪轉配置 3 Metastore審計配置 3.1 Metastore審計啟用 3.2 審計事件類型 4 高級審計方案 4.1 與Apache Ranger…

力扣-hot100 (缺失的第一個正數)

41. 缺失的第一個正數 困難 給你一個未排序的整數數組 nums &#xff0c;請你找出其中沒有出現的最小的正整數。 請你實現時間復雜度為 O(n) 并且只使用常數級別額外空間的解決方案。 示例 1&#xff1a; 輸入&#xff1a;nums [1,2,0] 輸出&#xff1a;3 解釋&#xff…

13前端項目----購物車修改

購物車修改 uuid臨時游客身份購物車部分功能全選修改商品數量修改商品勾選狀態刪除產品 uuid臨時游客身份 請求數據倉庫發起請求 ->問題&#xff1a;獲取不到購物車數據&#xff1f; 所以需要一個身份&#xff0c;告訴服務器是誰存的數據&#xff1f;是要獲取誰的數據&…

Mac電腦,idea突然文件都展示成了文本格式,導致ts,tsx文件都不能正常加載或提示異常,解決方案詳細說明如下

有一天使用clean my mac軟件清理電腦 突然發現idea出現了文件都以文本格式展示&#xff0c;如圖所示 然后就卸載&#xff0c;計劃重新安裝&#xff0c;安裝了好幾個版本&#xff0c;并且setting->file types怎么設置都展示不對&#xff0c;考慮是否idea沒卸載干凈&#xff…

Nginx搭建test服務器

創建test域名 進入阿里云添加解析 創建域名:test.xxxxx.com 服務器復制項目代碼 新建目錄,Git拉取項目代碼,安裝上插件包 修改配置文件,啟動測試服務 修改配置文件“服務器接口” 開啟服務pm2 start app.js --name "test" 表格含義: 列名含義說明id進程在…

MyBatis-Plus 非 Spring 環境使用時 `GenericTypeResolver` 缺失問題總結

MyBatis-Plus 非 Spring 環境使用時 GenericTypeResolver 缺失問題總結 問題描述 在非 Spring 環境中使用 MyBatis-Plus 3.4.3.1 及以上版本時&#xff0c;啟動程序會拋出以下錯誤&#xff1a; Exception in thread "main" java.lang.NoClassDefFoundError: org/s…

綜合案例:使用vuex對購物車的商品數量和價格等公共數據進行狀態管理

文章目錄 0.實現需求1.新建購物車模塊cart2.使用json-server模擬向后端請求數據3.在vuex請求獲取并存入數據,并映射到組件中,在組件中渲染【重點】3.1.安裝axios3.2.準備actions和mutations,獲取和存入數據到vuex中3.3.動態渲染:先用mapState映射list到組件頁面 4.點擊修改數量…

《數據結構初階》【順序表 + 單鏈表 + 雙向鏈表】

《數據結構初階》【順序表 單鏈表 順序表】 前言&#xff1a;先聊些其他的東西&#xff01;&#xff01;&#xff01;什么是線性表&#xff1f;什么是順序表&#xff1f;順序表的種類有哪些&#xff1f; 什么是鏈表&#xff1f;鏈表的種類有哪些&#xff1f; ---------------…

Android Retrofit框架分析(三):自動切換回主線程;bulid的過程;create方法+ServiceMethod源碼了解

目錄 Okhttp有什么不好&#xff1f;bulid的過程create方法ServiceMethodcall enqueue的過程為什么要學習源碼呢&#xff1f; 一、Okhttp有什么不好&#xff1f; Okhttp本身來說&#xff0c;是一個挺好的網絡框架&#xff0c;但&#xff0c;對于開發者而言&#xff0c;使用起…

C++ STL 基礎與多線程安全性說明文檔

C STL 基礎與多線程安全性說明文檔 一、STL 簡介 STL&#xff08;Standard Template Library&#xff0c;標準模板庫&#xff09;是 C 標準庫的重要組成部分&#xff0c;提供了常用的數據結構和算法的泛型實現&#xff0c;極大地提高了代碼的復用性和開發效率。 STL 的六大組…

數據結構之圖的分類和存儲

圖 圖(Graph)G由兩個集合V和E組成&#xff0c;記為&#xff1a;G(V,E)&#xff0c;其中V是頂點的有窮非空集合(其實就是頂點)&#xff0c;E是V 中頂點偶對的有窮集合(就是邊)。V(G)和E(G)通常分別表示圖G的頂點集合以及邊集合&#xff0c;E(G)可以為空集合&#xff0c;但是此時…

擴增子分析|微生物生態網絡穩定性評估之魯棒性(Robustness)和易損性(Vulnerability)在R中實現

一、引言 周集中老師團隊于2021年在Nature climate change發表的文章&#xff0c;闡述了網絡穩定性評估的原理算法&#xff0c;并提供了完整的代碼。自此對微生物生態網絡的評估具有更全面的指標&#xff0c;自此網絡穩定性的評估廣受大家歡迎。本系列將介紹網絡穩定性之魯棒性…

setup 函數在 Vue 3 中的作用是什么?什么時候會執行

文章目錄 前言? 一、setup() 函數的作用是什么&#xff1f;? 二、setup() 什么時候執行&#xff1f;? 三、setup() 的參數? 四、setup() 中不能做什么&#xff1f;? 五、常見用法示例? 六、總結&#xff08;適合背誦或面試回答&#xff09; <script setup> 是 **Vu…

JDBC實現--保姆級教程~

本來以為寫過一個使用python與數據庫連接的文章&#xff0c;但是今天突然發現沒有&#xff0c;那就直接寫Java與數據庫連接的吧。當然如果大家有需要可以告訴我&#xff0c;有時間的話也可以寫一個的pymysql的使用的。 數據庫有很多種&#xff0c;接下來我就以MySQL為例來進行講…

Ubuntu18.04搭建samda服務器

一.什么是Samba服務器&#xff1f; Samba服務器是一種基于開源協議實現的網絡共享服務軟件&#xff0c;主要用于在不同操作系統&#xff08;如Windows、Linux、Unix&#xff09;之間實現文件和打印機共享功能。其核心目標是解決跨平臺資源共享的兼容性問題&#xff0c;尤其是在…

《分詞算法大揭秘:BPE、BBPE、WordPiece、ULM常見方法介紹》

分詞算法是自然語言處理&#xff08;NLP&#xff09;中的一個重要預處理步驟&#xff0c;它將文本分割成更小的單元&#xff08;如單詞、子詞或字符&#xff09;。以下是幾種常見的分詞算法&#xff1a;Byte Pair Encoding (BPE)、Byte-level BPE (BBPE)、WordPiece 和 Unigram…

WordPress01 - 后臺常用功能

最近些日子研究Wordpress&#xff0c;做些簡單的筆記。 怎么安裝Wordpress&#xff0c;怎么進的后臺&#xff0c;這些咱就不嘮了哈&#xff0c;網上到處是教程。 目錄 1&#xff0c;Wordpress的后臺 1-1&#xff0c; Posts(投稿) 1-2&#xff0c;Media(媒體) 1-3&#xf…

R8周:RNN實現阿爾茨海默病診斷

&#x1f368; 本文為&#x1f517;365天深度學習訓練營中的學習記錄博客 &#x1f356; 原作者&#xff1a;K同學啊 一、前期準備 1.設置GPU import numpy as np import pandas as pd import torch from torch import nn import torch.nn as nn import torch.nn.functi…

今天python練習題

目錄 一、每日一言 二、練習題 三、效果展示 四、下次題目 五、總結 一、每日一言 不要害怕失敗&#xff0c;失敗可能成為我們前進的動力&#xff01; 二、練習題 有列表lst [[1,2,3],[4,5,6],[7,8,9]],取出其中的元素1/5/9組成新的列表 # 有列表lst [[1,2,3],[4,5,6],[…

機器人強化學習入門學習筆記(二)

基于上一篇的《機器人強化學習入門學習筆記》,在基于 MuJoCo 的仿真強化學習訓練中,除了 PPO(Proximal Policy Optimization)之外,還有多個主流強化學習算法可用于訓練機器人直行或其他復雜動作。 ?? 一、常見強化學習算法對比(可用于 MuJoCo) 算法類型特點適合場景PP…