數據結構-排序(2)

一、堆排序 (借助樹)

1.利用完全二叉樹構建大頂堆
2.堆頂元素和堆底元素進行交換,堆底元素不再參與構建,剩余元素繼續構建大頂堆

3.時間復雜度??O(nlogn)

1.完全二叉樹:按照從上到下,從左到右的順序進行排序

2.大頂堆: 任何一個節點值大于等于左右孩子,根節點一定是最大值

arr[i]的左孩子 arr[2i+1] ? ? ? ? ? 要求條件: arr[i]>= arr[2i+1]&&

?arr[i]的右孩子 arr[2i-2] ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?arr[i]>=arr[2i-2]

3.構建大頂堆:

第一大步:

1. 從后往前對每個數據依次進行檢測調整
2. 定義 parent 游標指向要檢測的節點
3. 定義 parent 的左孩子,判斷 child 是否為空(有孩子一定會有左孩子)
4. 如果 child 為空,則 parent 符合大頂堆
5. 如果 child 不為空,判斷 parent 有沒有右孩子,child 指向左右孩子的最大值。
6. 父子節點進行比較,如果父節點的值大,則符合大頂堆,繼續向前檢測。
7. 如果父節點的值小,則不符合大頂堆,父子節點進行交換。
8. parent 指向 child, child 指向左右孩子的最大值。直到 child 為空或者父節點的值大。

第二大步:

?1.只有堆頂變了,只維護堆頂就可以,做到堆頂最大

package com.pcby.demo;//堆排序
import java.util.Arrays;
/*1.利用完全二叉樹構建大頂堆* 2.堆頂元素和堆底元素進行交換,堆底元素不再參與構建,剩余元素繼續構建大頂堆*/public class HeapSort {public static void main(String[] args) {int[] arr= {5,7,4,2,0,3,1,6};sort(arr);System.out.println(Arrays.toString(arr));}// 排序public static void sort(int[] arr){// 第一大步for (int i = arr.length - 1; i >= 0; i--) {adjust(arr, i, arr.length);}// 第二大步for (int i = arr.length - 1; i >= 0; i--) {int temp = arr[0];arr[0] = arr[i];arr[i] = temp;adjust(arr, 0, i);}}// 維護public static void adjust(int[] arr, int parent, int length) {int child = 2 * parent + 1;while (child < length) {// 定義右孩子int rchild = child + 1;if (rchild < length && arr[rchild] > arr[child]) {child++;} // child 指向了左右孩子的最大值// 父子節點進行比較,父節點要大if (arr[parent] < arr[child]) {// 父子節點進行交換int temp = arr[parent];arr[parent] = arr[child];arr[child] = temp;// 父節點指向 child, child 指向左右孩子最大值parent = child;child = 2 * child + 1;} else {break;}}}
}

每一步思路:
1. 定義數組并調用排序函數:
在 ?main ?方法中,定義一個數組 ?arr ,其元素為 ?{5,7,4,2,0,3,1,6} 。
調用 ?sort ?方法對數組進行堆排序。
輸出排序后的數組。
2. 排序方法(sort 方法):
第一大步(構建初始大頂堆):
從數組的最后一個元素開始,逐個向前調整,確保每個父節點都大于其子節點。
調用 ?adjust ?方法對每個元素進行調整。
第二大步(排序過程):
將堆頂元素(最大值)與堆底元素交換,使最大值位于數組末尾。
堆的大小減 1(通過調整 ?length ?參數實現),對剩余元素重新調整為大頂堆。
重復上述交換和調整過程,直到堆的大小為 1。
3. 調整堆結構(adjust 方法):
初始化父節點和左孩子節點的位置。
在循環中,檢查右孩子節點是否存在且是否大于左孩子節點,將 ?child ?指向左右孩子中較大的那個。
如果父節點小于當前 ?child ?節點,交換它們的位置。
更新父節點和孩子節點的位置,繼續調整子樹,直到父節點大于等于孩子節點或孩子節點超出堆的范圍。

?二、基數排序(借助桶)

不能排負值,先排序個位,十位,百位

1.先建立0-9九個桶

2.看各個數字個位數都是多少,是多少放在哪個桶里

3.放好后從0號桶開始取數字,取出來,在排序十位,同理排序百位

 
package com.pcby.demo;import java.util.Arrays;public class Radix {public static void main(String[] args) {int[] arr = {5,14,20,125,362,61,94,4,12,1002,54,99,87,89};sort(arr);System.out.println(Arrays.toString(arr));}public static void sort(int[] arr) {// 找最大值int max = arr[0];for (int i = 0; i < arr.length; i++) {if (arr[i] > max) {max = arr[i];}}// 最大值的位數int len = (max + "").length();// 聲明 0-9 十個桶int[][] bucket = new int[10][arr.length];// 桶記錄工具int[] elementCount = new int[10];int n = 1;// 循環放入取出for (int num = 0; num < len; num++) {// 放入for (int i = 0; i < arr.length; i++) {// 放到哪個桶 余數int element = arr[i] / n % 10;int count = elementCount[element];bucket[element][count] = arr[i];// 桶記錄 +1elementCount[element]++;}// 取出int index = 0;for (int i = 0; i < elementCount.length; i++) {if (elementCount[i] > 0) {for (int j = 0; j < elementCount[i]; j++) {arr[index] = bucket[i][j];index++;}elementCount[i] = 0;}}n = n * 10;}}
}

三、快速排序

待排序數組的第一個作為基準數;

定義游標 j 從后往前,找比基準數小的值,找到后停下;

定義游標 i 從前往后,找比基準數大的值,找到后停下;

i j 指向的數據交換 j 繼續找比基準數小的,i 繼續找比基準數大的,直到 i j 相遇 基準數和相遇位置交換,基準數到達正確位置;

以基準數為起始點,拆分成左右兩部分,重復上述所有,直到數據獨立

時間復雜度: O(n log n)

import java.util.Arrays;public class QuickSort {public static void main(String[] args) {int[] arr = {5, 7, 4, 2, 0, 3, 1, 6};sort(arr, 0, arr.length - 1);System.out.println(Arrays.toString(arr));}public static void sort(int[] arr, int left, int right) {if (left >= right) {return;}int base = arr[left];int j = right;int i = left;while (i != j) {while (arr[j] >= base && i != j) {j--;}while (arr[i] <= base && i != j) {i++;}int temp = arr[i];arr[i] = arr[j];arr[j] = temp;}arr[left] = arr[i];arr[i] = base;sort(arr, left, i - 1);sort(arr, i + 1, right);}
}

四、歸并排序

即將數組不斷拆分為小數組,對小數組進行排序后再合并成大數組。先拆分再合并,在合并的過程中通過臨時空間進行排序。

空間復雜度:O(n)

?
package com.qcbj.sort;
import java.util.Arrays;public class MergeSort {public static void main(String[] args) {int[] arr = {5, 7, 4, 2, 0, 3, 1, 6};split(arr, 0, arr.length - 1);System.out.println(Arrays.toString(arr));}public static void split(int[] arr, int left, int right) {if (left == right) {return;}int mid = (left + right) / 2;split(arr, left, mid);split(arr, mid + 1, right);merge(arr, left, mid, right);}public static void merge(int[] arr, int left, int mid, int right) {int s1 = left;int s2 = mid + 1;int[] temp = new int[right - left + 1];int index = 0;while (s1 <= mid && s2 <= right) {if (arr[s1] <= arr[s2]) {temp[index] = arr[s1];index++;s1++;} else {temp[index] = arr[s2];index++;s2++;}}while (s1 <= mid) {temp[index] = arr[s1];index++;s1++;}while (s2 <= right) {temp[index] = arr[s2];index++;s2++;}for (int i = 0; i < temp.length; i++) {arr[left + i] = temp[i];}}
}?

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

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

相關文章

Qt-信號和槽

一.信號和槽概念1. 信號&#xff08;Signal&#xff09;概念&#xff1a;信號是 Qt 對象在狀態發生變化或事件發生時自動發出的通知。比如按鈕被點擊、文本框內容變化、定時器超時等&#xff0c;都會發出相應信號。本質&#xff1a;它只是一個函數聲明&#xff08;沒有函數體&a…

NLP學習開始-02邏輯回歸

邏輯回歸什么是邏輯回歸邏輯回歸的應用場景邏輯回歸幾個重要概念Sigmoid 函數損失函數構建邏輯回歸模型的步驟舉個例子參數解釋模型優化什么是邏輯回歸 邏輯回歸&#xff08;Logistic Regression&#xff09;是一種廣泛應用于分類問題的統計學習方法&#xff0c;盡管名字中帶有…

【運維進階】LAMPLNMP 最佳實踐

LAMP/LNMP 最佳實踐 LAMP/LNMP 組件 LAMP&#xff1a;LinuxApacheMysql/MariadbPHP/Python/Perl。 LNMP&#xff1a;LinuxNginxMysql/MariadbPHP/Python/Perl。 Linux&#xff1a;操作系統&#xff0c;提供程序運行基礎。Apache/Nginx&#xff1a;Web 服務器&#xff0c;提供網…

深入解析 resolv.conf 文件:DNS 配置的核心

/etc/resolv.conf 文件是 Linux 和類 Unix 系統中 DNS 配置的核心組件。它決定了系統如何將域名解析為 IP 地址&#xff0c;這是網絡通信的關鍵環節。本文將深入探討 resolv.conf 文件的核心內容&#xff0c;重點講解 nameserver 指令以及 options 配置中的 attempts 和 rotate…

【LeetCode】102 - 二叉樹的層序遍歷

題目描述 給你二叉樹的根節點 root&#xff0c;返回其節點值的層序遍歷&#xff08;即逐層地&#xff0c;從左到右訪問所有節點&#xff09;。 解題思路 使用 BFS&#xff08;廣度優先搜索&#xff09;的思想&#xff0c;維護當前層的所有節點&#xff0c;逐層處理&#xff1a;…

計算機網絡1-5:計算機網絡的性能指標

目錄 常用性能指標 速率 帶寬 吞吐量 時延 時延帶寬積 ?往返時間 ?利用率 ?丟包率 常用性能指標 性能指標可以從不同的方面來度量計算機網絡的性能 常用的計算機網絡的性能指標有8個:速率、帶寬、吞吐量、時延、時延帶寬積、往返時間、利用率、丟包率 速率 比特…

TDengine IDMP 文檔介紹

TDengine IDMP (Industrial Data Management Platform) 是一款 AI 原生的物聯網、工業數據管理平臺。它通過經典的樹狀層次結構組織傳感器、設備采集的數據&#xff0c;建立數據目錄&#xff0c;對數據提供語境化、標準化的處理、并提供實時分析、可視化、事件管理與報警等功能…

使用 iFLOW-CLI GitHub Action 和 Qwen3-Coder 給 GitHub 倉庫生成幻燈片風格的文檔站點

阿里的心流 https://www.iflow.cn/ 團隊最近開源了一款基于終端的 AI Agent 工具 iFLOW CLI, 目前可以免費使用到強大的 Qwen3-Coder、Kimi K2 等模型。又是一款類似 Anthropics Claude Code 的產品。 iFlow CLI 是一款直接在終端中運行的強大 AI 助手。它能夠無縫分析代碼倉庫…

【2025最新】在 macOS 上構建 Flutter iOS 應用

推薦超級課程&#xff1a; 本地離線DeepSeek AI方案部署實戰教程【完全版】Docker快速入門到精通Kubernetes入門到大師通關課AWS云服務快速入門實戰 目錄軟件要求操作系統開發工具文本編輯器或集成開發環境安裝 Flutter SDK下載并安裝 Flutter將 Flutter 添加到您的PATH配置 i…

MySQL 臨時表詳細說明

目錄 MySQL 臨時表詳細說明 1. 定義 2. 核心特性 3. 創建與使用 4. 典型應用場景 5. 生命周期管理 6. 注意事項 7. 性能優化建議 MySQL 臨時表詳細說明 1. 定義 臨時表是存儲在內存或磁盤上的臨時性數據表&#xff0c;僅在當前數據庫會話中存在。會話結束時自動銷毀&a…

深入解析 Apache APISIX 在微服務網關中的性能優化實踐指南

深入解析 Apache APISIX 在微服務網關中的性能優化實踐指南 文章類型&#xff1a;性能優化實踐指南 技術領域&#xff1a;微服務架構 —— API 網關 文章結構&#xff1a;原理深度解析型 目標讀者&#xff1a;有一定微服務與運維基礎的后端開發工程師一、技術背景與應用場景 隨…

【Spring Boot刷新上下文核心流程詳解】

Spring Boot 刷新上下文核心流程詳解 一、前言 在使用 Spring Boot 啟動應用時&#xff0c;控制臺會打印出一大串日志&#xff0c;其中最核心的啟動動作之一就是 刷新上下文&#xff08;refresh&#xff09;。 refresh 方法不僅負責 Bean 的創建與初始化&#xff0c;還涉及監…

關于過濾器(Filter)的學習

過濾器&#xff08;Filter&#xff09;概述 過濾器是 Java Servlet 規范的一部分&#xff0c;用于在請求到達 Servlet 之前或響應返回客戶端之前攔截請求和響應。它可以用于執行各種任務&#xff0c;如請求預處理、響應后處理、身份驗證、日志記錄等。 過濾器的作用 預處理請…

Spring AI 打造智能面試人實戰

Spring AI人工智能面試機器人相關實例 以下是與Spring AI人工智能面試機器人相關的實用案例,涵蓋技術實現、功能設計及常見問題解決方案,按應用場景分類呈現: 技術集成案例 調用Hugging Face模型庫處理專業領域問題 通過Spring Security添加面試會話身份驗證 結合WebSoc…

QT 程序發布時候調用自定義動態庫

1、需要在pro文件中增加下面的內容&#xff1a;QMAKE_LFLAGS "-Wl,-rpath,\\$$ORIGIN\" QMAKE_LFLAGS "-Wl,-rpath,\\$$ORIGIN/lib\" QMAKE_LFLAGS "-Wl,-rpath,\\$$ORIGIN/../lib\"其中lib為動態庫的文件夾名稱&#xff0c;可以根據自己喜好…

SpringBoot學習日記 Day6:解鎖微服務與高效任務處理

一、開篇&#xff1a;從單體到微服務的思維轉變剛開始接觸微服務時&#xff0c;我總習慣把所有功能寫在一個項目里。直到項目越來越臃腫&#xff0c;每次修改都要全量部署&#xff0c;才意識到微服務架構的價值。今天我們就來探索SpringBoot在微服務場景下的強大能力&#xff0…

機械學習--DBSCAN 算法(附實戰案例)

DBSCAN 算法詳解DBSCAN&#xff08;Density-Based Spatial Clustering of Applications with Noise&#xff0c;帶噪聲的基于密度的空間聚類應用&#xff09;是一種經典的密度聚類算法&#xff0c;由 Martin Ester 等人于 1996 年提出。與 K-means 等基于距離的聚類算法不同&am…

【昇騰】基于RK3588 arm架構Ubuntu22.04系統上適配Atlas 200I A2加速模塊安裝EP模式下的驅動固件包_20250808

一、背景 1.1 主要的硬件是&#xff1a;1.2 主要的軟件是&#xff1a; RK3588跑操作系統Atlas 200I A2加速模塊作為EP模式關鍵參數版本說明CPU架構aarch64OS版本Ubuntu 22.04.5 LTSkernel版本5.10.198 二、適配 準備固件run包文件&#xff1a;Ascend-hdk-310b-npu-firmware_7.…

如何在 VS Code 中進行 `cherry-pick`

cherry-pick 是 Git 的一個功能&#xff0c;允許你選擇某個 commit 并將其應用到當前分支&#xff0c;而無需合并整個分支。在 VS Code 中&#xff0c;你可以通過 內置的 Git 功能 或 終端 來完成 cherry-pick。方法 1&#xff1a;使用 VS Code 的 Git 圖形界面&#xff08;GUI…

STM32CubeMX(十三)FatFs文件系統(SPI驅動W25Qxx)

目錄 一、知識點 1. 什么是Fatfs文件系統? 2. Fatfs操作系統控制流程 二、實戰操作 1.CubeMX配置 2. 配置串口以及SPI 3. 修改功能映射接口 4. 添加測試代碼 5. 實驗現象 在完成本章之前需要完成一些基礎配置,詳情查看下面的文章。 STM32CubeMX(二)新建工…