排序算法—交換排序(冒泡、快速)(動圖演示)

目錄

十大排序算法分類?編輯

冒泡排序

算法步驟:

?動圖演示:

性能分析:

代碼實現(Java):

快速排序(挖坑法)

算法步驟:

動圖演示:

性能分析:

代碼實現(Java):


十大排序算法分類

本篇分享十大排序算法中的 需要進行交換操作的冒泡排序快速排序?, 其余算法也有介紹噢(努力趕進度中,后續會添加上)
?

冒泡排序

冒泡排序是一種非常直觀的排序算法,遍歷數組,每次比較兩個元素,如果后者比前者小則交換位置?,重復的進行直至沒有再需要交換,說明該數組排序完成。冒泡排序的 名字由來是因為越小的元素會經過交換慢慢"浮"到數組的頂端。

算法步驟:

核心邏輯

  • 外層循環控制輪數,共進行?n-1?輪遍歷,n?為數組長度。
  • 每輪內層循環比較相鄰元素?arr[j]?和?arr[j+1],若前者較大則交換。
  • 每輪結束后,當前未排序部分的最大值會“冒泡”到正確位置(數組末尾)。

優化方法

  • 提前終止:引入boolean變量,如果在某輪內循環未發生交換,說明數組有序,可直接結束排序
  • ?減少遍歷范圍:每輪外層循環后,數組末尾已有序,內層循環無需再比較已排序部分。

終止條件

  • ?外層循環完成n?- 1次遍歷,或boolean = false

?動圖演示:

性能分析:

時間復雜度

  • ?最好情況:數組已經有序,此時只需要遍歷一次,時間復雜度 O(n)
  • ?最壞情況:數組完全倒序,此時需要遍歷n - 1次,每次遍歷都需要進行n - i 次 比較可能的交換(i為當前遍歷次數),因此時間復雜度為O(n^2)
  • ? 平均情況:時間復雜度為O(n^2)? ? ?

空間復雜度

  • 僅需常數級額外空間 因此空間復雜度為O(1)

穩定性:

  • 穩定排序(相等元素不會交換位置)

代碼實現(Java):

/*** 冒泡排序算法實現(升序排序)* @param arr 待排序的整型數組*/
public void bubbleSort(int[] arr) {// 獲取數組長度int n = arr.length;// 布爾變量用于    boolean swapped;// 外層循環:控制排序輪數(最多需要 n-1 輪)for (int i = 0; i < n - 1; i++) {// 每輪開始前初始化交換標志為 falseswapped = false;// 內層循環:比較相鄰元素并交換// 每輪結束后,最大的元素會"冒泡"到數組末尾,所以比較范圍逐漸縮小for (int j = 0; j < n - i - 1; j++) {// 如果前一個元素大于后一個元素(升序排序)if (arr[j] > arr[j + 1]) {// 交換相鄰元素int temp = arr[j];arr[j] = arr[j + 1];arr[j + 1] = temp;// 標記發生了交換swapped = true;}}// 優化:如果本輪沒有發生任何交換,說明數組已經有序,提前結束排序if (!swapped) {break;}}
}

快速排序(挖坑法)

快速排序核心就是選擇一個基準值(就是一個作參照的數),然后將數組分成左右兩部分,左邊是比基準值小的元素。右邊是比基準值大的元素。 然后遞歸地對左右兩部分繼續進行這個過程,最終整個數組有序

快速排序是通過一次分區就定位一個元素的最終位置,并遞歸處理兩側子數組

算法步驟:

? ?核心邏輯

  1. 首先設定一個基準值 (通常是第一個數字/最后一個數字),通過該基準值將數組分成左右兩部分。
  2. 分區(partition):將所有小于基準值的元素移到基準值左邊,大于的移到右邊

  3. 遞歸排序:對左右兩個子數組遞歸進行上述過程

  4. 概括來說為 挖坑填數 + 分治法

?優化方法

  • 采用三數取中法(取左、中、右三個位置的中間值作為基準值)
  • 如果分區后子數組長度小于閾值(如 10)時,直接改用插入排序,減少了遞歸的開銷

? 終止條件

  • 當left >= right (起始索引大于等于結束索引,子數據長度 <= 1),終止當前遞歸(說明該子數組已有序)
  • 所有子數組均完成分區和排序時,整個數組即有序

動圖演示:

(借用大佬的動圖)

性能分析:

時間復雜度

  • 時間性能你取決于遞歸的深度
  • 最好情況:二叉樹幾乎平衡時,也就是數組劃分的比較均勻(基準值位于中間)。,遞歸次數最少,要log2N 次。遞歸過程中需要對i,j下標一起掃描數組,所以總體時間復雜度時O(N*log2N)
  • 最壞情況二叉樹極度不平衡 ,整體時間復雜度達到 (N2)

空間復雜度:

  • 空間性能取決于遞歸消耗的棧空間
  • 最好情況:已經分析過,需要遞歸logzN次,空間復雜度為O(logzN)
  • 最壞情況已經分析過,需要遞歸N-1次,空間復雜度為O(N)

穩定性:

  • 不穩定?

代碼實現(Java):

public static void quickSort(int[] array) {quick(array, 0, array.length - 1);}private static void quick(int[] array, int start, int end) {// 取大于號,防止 start > endif (start >= end) {return;}int pivot = pirtiton1(array, start, end);quick(array, start, pivot - 1);quick(array, pivot + 1, end);}// 挖坑法private static int pirtiton1(int[] array, int left, int right) {int tmp = array[left];while (left < right) {// 為什么判斷條件加等號,// 用int[] arr = {5, 7, 3, 1, 4, 9, 6, 5}測試while (left < right && array[right] >= tmp) {right--;}array[left] = array[right];while (left < right && array[left] <= tmp) {left++;}// 將找到的大于基準值的元素填入右邊的"坑"array[right] = array[left];}// 將基準值放入最后的"坑"中(此時left == right)array[left] = tmp;return left;}

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

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

相關文章

2023 年 5 月青少年軟編等考 C 語言八級真題解析

目錄 T1. 道路 思路分析 T2. Rainbow 的商店 思路分析 T3. 冰闊落 I 思路分析 T4. 青蛙的約會 思路分析 T1. 道路 題目鏈接:SOJ D1216 N N N 個以 1 ~ N 1 \sim N 1~N 標號的城市通過單向的道路相連,每條道路包含兩個參數:道路的長度和需要為該路付的通行費(以金幣的數…

【vue-4】深入理解 Vue 3 中的 v-for 指令

Vue.js 作為現代前端框架的代表之一&#xff0c;其模板指令系統提供了強大的數據綁定和渲染能力。其中&#xff0c;v-for 指令是 Vue 中最常用且最重要的指令之一&#xff0c;它允許我們基于數據源循環渲染元素或組件。在 Vue 3 中&#xff0c;v-for 保留了一貫的簡潔語法&…

《R for Data Science (2e)》免費中文翻譯 (第1章) --- Data visualization(1)

寫在前面 本系列推文為《R for Data Science (2)》的中文翻譯版本。所有內容都通過開源免費的方式上傳至Github&#xff0c;歡迎大家參與貢獻&#xff0c;詳細信息見&#xff1a; Books-zh-cn 項目介紹&#xff1a; Books-zh-cn&#xff1a;開源免費的中文書籍社區 r4ds-zh-cn …

界面組件DevExpress WPF中文教程:Grid - 如何完成節點排序和移動?

DevExpress WPF擁有120個控件和庫&#xff0c;將幫助您交付滿足甚至超出企業需求的高性能業務應用程序。通過DevExpress WPF能創建有著強大互動功能的XAML基礎應用程序&#xff0c;這些應用程序專注于當代客戶的需求和構建未來新一代支持觸摸的解決方案。 無論是Office辦公軟件…

【Prometheus+Grafana篇】監控通過Keepalived實現的MySQL HA高可用架構

&#x1f4ab;《博主主頁》&#xff1a;    &#x1f50e; CSDN主頁__奈斯DB    &#x1f50e; IF Club社區主頁__奈斯、 &#x1f525;《擅長領域》&#xff1a;擅長阿里云AnalyticDB for MySQL(分布式數據倉庫)、Oracle、MySQL、Linux、prometheus監控&#xff1b;并對…

k8s:利用kubectl部署postgis:17-3.5

1.離線環境CPU:Hygon C86 7285 32-core Processor 操作系統&#xff1a;麒麟操作系統 containerd&#xff1a;1.7.27 Kubernetes:1.26.12 KubeSphere:4.1.2 kubekey&#xff1a;3.1.10 Harbor:2.13.1 Postgis:17-3.52.創建并執行postgresql-headless.yaml2.1創建apiVersion: v1…

Mysql(存儲過程)

目錄 介紹 特點 存儲過程創建 系統變量(不重要) 用戶變量 局部變量 if 判斷 參數&#xff08;in, out, inout) case while repeat loop 游標和條件處理程序-handler 存儲函數 為了防止以后忘記&#xff0c;反復去看視頻浪費時間&#xff0c;特寫一篇 介紹 存儲過程…

Effective Python 第14條: 用sort方法的key參數來表示復雜的排序邏輯

一、引言&#xff1a;Python排序功能的重要性 在Python開發中&#xff0c;排序功能是一個常見的需求。無論是處理數據、優化算法&#xff0c;還是提升用戶體驗&#xff0c;排序都是不可或缺的一部分。Python的列表內置了sort方法&#xff0c;提供了靈活的排序功能。然而&#…

react+antd 可拖拽模態框組件

DraggableModal 可拖拽模態框組件使用說明 概述 DraggableModal 是一個基于 dnd-kit/core 實現的可拖拽模態框組件&#xff0c;允許用戶通過拖拽標題欄來移動模態框位置。該組件具有智能邊界檢測功能&#xff0c;確保模態框始終保持在可視區域內。 功能特性 ? 可拖拽移動&…

MySQL的基本操作及相關python代碼

下面為你介紹 MySQL 的基本操作,以及對應的 Python 代碼實現。我會先介紹 SQL 基本操作,再展示如何用 Python 連接 MySQL 并執行這些操作。 一、MySQL 基本操作(SQL 語句) 1. 連接數據庫 bash mysql -u root -p2. 創建數據庫 sql CREATE DATABASE testdb;3. 使用數據…

Armbian(斐訊N1)安裝xfce桌面以及遠程環境

安裝xfce桌面以及vncserver(遠程連接) 安裝xfce桌面 apt-get install xfce4 xfce4-goodies xorg dbus-x11 x11-xserver-utils ubuntu的安裝gdm3&#xff0c; apt install gdm3 debian安裝lightdm。 apt install lightdm 安裝vnc server apt-get install tightvncserver 中文字體…

【Oracle】Oracle 11g打補丁時遇到opatch apply命令無法識別

?? 1. 使用完整路徑執行命令 問題原因&#xff1a;若未將$ORACLE_HOME/OPatch加入系統PATH環境變量&#xff0c;直接輸入opatch apply會因系統無法定位命令而報錯。 解決方案&#xff1a; 改用絕對路徑執行&#xff1a; $ORACLE_HOME/OPatch/opatch apply例如&#xff1a; /u…

單例模式詳細講解

一.定義單例模式是一種創建型設計模式&#xff0c;確保一個類只有一個實例&#xff0c;并提供一個全局訪問點特點&#xff1a;1.構造函數和析構函數私有化2.禁用拷貝構造函數和賦值運算符重載&#xff08;delete&#xff09;3.利用靜態成員函數和靜態成員變量來給外界提供訪問二…

KORGym:評估大語言模型推理能力的動態游戲平臺

KORGym&#xff1a;評估大語言模型推理能力的動態游戲平臺 現有評估基準多受領域限制或 pretraining 數據影響&#xff0c;難以精準測LLMs內在推理能力。KORGym平臺應運而生&#xff0c;含50余款游戲&#xff0c;多維度評估&#xff0c;本文將深入解析其設計、框架、實驗及發現…

ISPDiffuser文章翻譯理解

ISPDiffuser: Learning RAW-to-sRGB Mappings with Texture-Aware Diffusion Models and Histogram-Guided Color Consistency翻譯 Type: Conference paper Author: Yang Ren1,4, Hai Jiang1,4, Menglong Yang1,2,?, Wei Li1,2, Shuaicheng Liu3,4,? Select: ???????…

C++線程池執行步驟分析,總結線程池流程

線程池流程總結&#xff1a;1、構造函數中創建線程&#xff0c;并添加到線程池&#xff08;構造函數返回時&#xff0c;線程自動啟動&#xff0c;并停在等待wait&#xff1a;從線程池取出一個任務處&#xff09;&#xff1b; 2、主線程中添加任務&#xff0c;到任務隊列。并用“…

Java 通過 HttpURLConnection發送 http 請求

問題&#xff1a; 在調試 kill 接口的時候&#xff0c;對方的服務用的是 Django RestFramework 框架提供的接口&#xff0c;用 python 請求時得到的內容如下&#xff1a; ? ~ python3 test.py <Response [200]> "true" // 對應的代碼是 print(response, r…

【PTA數據結構 | C語言版】列出連通集

本專欄持續輸出數據結構題目集&#xff0c;歡迎訂閱。 文章目錄題目代碼題目 給定一個有 n 個頂點和 m 條邊的無向圖&#xff0c;請用深度優先遍歷&#xff08;DFS&#xff09;和廣度優先遍歷&#xff08;BFS&#xff09;分別列出其所有的連通集。假設頂點從 0 到 n?1 編號。…

GoLang教程005:switch分支

3.4 Switch分支 在 GoLand&#xff08;其實是 JetBrains 開發的 Go 編程語言 IDE&#xff09;中&#xff0c;switch 是 Go 語言&#xff08;Golang&#xff09; 的一個重要控制結構&#xff0c;用于替代多個 if-else 語句。 ? 特點說明特性說明自動 breakGo 的 switch 語句默認…

uniapp相關地圖 API調用

目錄 一、 注意事項&#xff1a; manifest.json需增加配置 二、獲取用戶收貨地址 [uni.chooseAddress] 三、獲取當前的地理位置、速度 [uni.getLocation] 四、打開地圖選擇位置、查看位置(導航) [uni.chooseLocation] [uni.openLocation] 五、使用騰訊地圖逆地址解析接口實…