算法: 冒泡排序

冒泡排序是一種簡單的排序算法,通過相鄰元素的比較和交換,使較大的元素逐漸"浮"到數組末尾。

時間復雜度:最佳 O(n) | 平均 O(n2) | 最差 O(n2)

空間復雜度:O(1)

穩定性:穩定

應用場景/前提條件

  • 適用于小規模數據
  • 對幾乎已排序的數據效率較高

算法步驟

  1. 比較相鄰的元素。如果第一個比第二個大,就交換它們
  2. 對每一對相鄰元素做同樣的工作,從開始第一對到結尾的最后一對
  3. 這步做完后,最后的元素會是最大的數
  4. 針對所有的元素重復以上的步驟,除了已經是最大數的最后一個
  5. 持續每次對越來越少(每次重復都會少一個最大數)的元素重復上面的步驟,直到沒有任何一對數字需要比較

public static void bubbleSort(int[] arr) {int n = arr.length;for (int i = 0; i < n - 1; i++) {// 每次遍歷后,最大的i+1個元素已經排好序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;}}}}
  1. 外層循環:控制排序的輪數。對于長度為 n 的數組,需要進行 n-1 輪排序。每一輪排序都會將當前未排序部分的最大元素 "冒泡" 到右側。
  2. 內層循環:負責比較相鄰元素并在必要時交換它們。每一輪排序后,最大的元素已經就位,因此內層循環的次數可以逐輪減少(通過n - i - 1實現)。
    1. 每輪排序后的有序元素
    冒泡排序的特點是:每一輪結束后,最大的 i+1 個元素都會被排到數組的右側(升序排序)。例如:第 1 輪后,最大的元素被排到了最后一個位置。
    第 2 輪后,第二大的元素被排到了倒數第二個位置。
    依此類推,第 i 輪后,最大的 i+1 個元素都已經在正確的位置上。2. 內層循環的邊界
    由于右側的 i+1 個元素已經有序,下一輪比較時就不需要再考慮它們。因此,
    每一輪需要比較的元素數量是逐漸減少的:第 1 輪需要比較 n-1 次(所有元素都參與比較)。
    第 2 輪需要比較 n-2 次(最后一個元素已經有序,不需要再比較)。
    第 i 輪需要比較 n - i - 1 次。3. 為什么是 n - i - 1?n 是數組的總長度。
    i 是當前外層循環的輪數(從 0 開始計數)。
    n - i 表示剩余未排序元素的數量。
    由于每次比較的是相鄰的兩個元素,因此需要進行 n - i - 1 次比較。

  3. 元素交換:當發現相鄰元素順序錯誤時(前一個元素大于后一個元素),通過臨時變量temp交換它們的位置。
 if (arr[j] > arr[j + 1]) {int temp = arr[j];arr[j] = arr[j + 1];arr[j + 1] = temp;}

優缺點

優點

  • 代碼簡單,容易實現
  • 適合小規模數據排序
  • 對于幾乎已經排好序的數據,效率較高
  • 穩定的排序算法

缺點

  • 時間復雜度高,為O(n2)
  • 隨著元素數量增加,效率急劇下降
  • 每次只能將一個元素移動到其最終位置,效率不高

雞尾酒排序(雙向冒泡排序)


雞尾酒排序是冒泡排序的一種變體,它從低到高然后從高到低來回排序,比冒泡排序的效率稍微高一點:

public static void cocktailSort(int[] arr) {boolean swapped = true;int start = 0;                  // 左側已排序邊界int end = arr.length - 1;       // 右側已排序邊界while (swapped) {// 從左到右掃描,將最大元素移到右側swapped = false;for (int i = start; i < end; i++) {if (arr[i] > arr[i + 1]) {swap(arr, i, i + 1);swapped = true;}}// 掃描結束后,最大元素已在end位置,因此下次掃描到end-1即可end--;// 如果沒有交換,說明數組已排序if (!swapped) break;// 從右到左掃描,將最小元素移到左側swapped = false;for (int i = end - 1; i >= start; i--) {if (arr[i] > arr[i + 1]) {swap(arr, i, i + 1);swapped = true;}}// 掃描結束后,最小元素已在start位置,因此下次從start+1開始start++;}
}private static void swap(int[] arr, int i, int j) {int temp = arr[i];arr[i] = arr[j];arr[j] = temp;
}

測驗

  1. 冒泡排序的平均時間復雜度是多少?
  2. 冒泡排序是穩定的排序算法嗎?
  3. 對于已經排好序的數組,優化版冒泡排序的時間復雜度是多少?
  4. 冒泡排序每一輪遍歷后,數組尾部會有什么特點?
  5. 如何優化冒泡排序以提高效率?

測驗答案

  1. 冒泡排序的平均時間復雜度是O(n2)。
  2. 是的,冒泡排序是穩定的排序算法。因為只有當前一個元素大于后一個元素時才交換,相等元素不會改變相對位置。
  3. 對于已經排好序的數組,優化版冒泡排序的時間復雜度是O(n)。因為第一輪遍歷不會發生交換,優化版會檢測到這點并提前終止。
  4. 冒泡排序每一輪遍歷后,數組尾部會有一個元素到達其最終位置,且是當前未排序部分中的最大元素。第i輪結束后,末尾i個元素已排好序。
  5. 優化冒泡排序的方法:
    • 添加標志位跟蹤是否發生交換,無交換則提前終止
    • 記錄最后一次交換位置,下一輪只遍歷到該位置
    • 使用雙向冒泡(雞尾酒排序),同時將最大值上浮和最小值下沉

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

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

相關文章

基于SpringBoot的家電銷售展示平臺

源碼編號&#xff1a;S567 源碼名稱&#xff1a;基于SpringBoot的家電銷售展示平臺 用戶類型&#xff1a;雙角色&#xff0c;用戶、管理員 數據庫表數量&#xff1a;14 張表 主要技術&#xff1a;Java、Vue、ElementUl 、SpringBoot、Maven 運行環境&#xff1a;Windows/M…

java+vue+SpringBoo智慧旅游系統(程序+數據庫+報告+部署教程+答辯指導)

源代碼數據庫LW文檔&#xff08;1萬字以上&#xff09;開題報告答辯稿ppt部署教程代碼講解代碼時間修改工具 技術實現 開發語言&#xff1a;后端&#xff1a;Java 前端&#xff1a;vue框架&#xff1a;springboot數據庫&#xff1a;mysql 開發工具 JDK版本&#xff1a;JDK1.…

Docker 入門教程(三):鏡像操作命令

文章目錄 &#x1f433; Docker 入門教程&#xff08;三&#xff09;&#xff1a;鏡像操作命令獲取鏡像&#xff1a;docker pull查看鏡像&#xff1a;docker images刪除鏡像&#xff1a;docker rmi搜索鏡像&#xff1a;docker search鏡像打標簽&#xff1a;docker tag鏡像詳情與…

如何修改discuz文章標題字數限制 修改成255

在 Discuz! X3.5 中&#xff0c;文章&#xff08;主題&#xff09;標題字數的限制可以通過修改數據庫結構以及后臺配置來實現&#xff0c;以下是完整的修改方法&#xff0c;將標題長度限制改為 255 個字符&#xff1a; ? 一、修改數據庫字段長度 Discuz 默認標題字段是 subje…

基于BP神經網絡的26個英文字母識別

本課題旨在設計并實現一個基于BP&#xff08;反向傳播&#xff09;神經網絡的英文字母識別系統&#xff0c;實現對手寫或打印的26個英文字母&#xff08;A-Z&#xff09;的自動分類識別。項目首先對字母圖像進行預處理&#xff08;如灰度化、歸一化、二值化和特征提取&#xff…

系統架構設計師論文分享-論云原生技術的應用

我的軟考歷程 摘要 2023年2月&#xff0c;我所在的公司做了開發紗線MES系統的決定&#xff0c;該系統為國內紗線工廠提供SAAS服務&#xff0c;旨在提高紗線工廠的智能化和數字化水平。我在該項目中被任命為系統架構設計師&#xff0c;全面掌管該項目的架構設計工作。該項目涉…

重置 MySQL root 密碼

引言 在linux可能存在安裝mysql安裝失敗&#xff0c;一直不出現默認密碼 /usr/local/mysql/mysql-8.0.26/bin/mysqld --defaults-file/etc/my.cnf --usermysql --basedir/usr/local/mysql/mysql-8.0.26 --datadir/usr/local/mysql/mysql-8.0.26/data --lower-case-table-name…

面試八股---HTML

面試八股 1、HTML 1.1 src和href的區別 src 用于替換當前元素&#xff0c;href 用于在當前文檔和引用資源之間確立聯系。 核心區別在于 href 關聯的資源&#xff08;主要是 CSS&#xff09;是用于描述頁面外觀的&#xff0c;瀏覽器可以先生成內容再應用樣式&#xff0c;因此…

氣候智能體:AI如何重構人類應對氣候危機的決策體系?

前言 前些天發現了一個巨牛的人工智能免費學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到網站 《氣候智能體&#xff1a;AI如何重構人類應對氣候危機的決策體系&#xff1f;》 展開全景式論述。文章結合2025年最新技術突破與…

UITableView的位置向下偏移, contentInsetAdjustmentBehavior使用詳情

一.contentInsetAdjustmentBehavior 作用: 在iOS 11及以后&#xff0c;蘋果引入了安全區域&#xff08;Safe Area&#xff09;的概念,當UITableView的frame超出了安全區域,系統會自定調整SafeAreaInsets的值,它可以自動調整內容的內邊距&#xff0c;使得內容不會被導航欄遮擋。…

騰訊云RayData全新推出“行業解決方案模板”,一鍵快捷制作3D數據可視化作品

點擊藍字? 關注我們 本文共計958字 預計閱讀時長3分鐘 騰訊云RayData Plus是一款專注于高視效的3D數據可視化的實時渲染工具。 功能全面&#xff1a;提供了三維、二維、動畫、數據、交互邏輯等各類能力&#xff1b; 零代碼制作&#xff1a;靈活的節點式創作&#xff0c;即便沒…

深度解析基于貝葉斯的垃圾郵件分類

貝葉斯垃圾郵件分類的核心邏輯是基于貝葉斯定理&#xff0c;利用郵件中的特征&#xff08;通常是單詞&#xff09;來計算該郵件屬于“垃圾郵件”或“非垃圾郵件”的概率&#xff0c;并根據概率大小進行分類。它是一種樸素貝葉斯分類器&#xff0c;因其假設特征&#xff08;單詞…

WPF 3D 開發全攻略:實現3D模型創建、旋轉、平移、縮放

&#x1f3ae; WPF 3D 入門實戰&#xff1a;從零打造一個可交互的立方體模型 標題&#xff1a; &#x1f680;《WPF 3D 開發全攻略&#xff1a;實現旋轉、平移、縮放與法線顯示》 &#x1f4a1; 引言 在現代圖形應用中&#xff0c;3D 可視化已經成為不可或缺的一部分。WPF 提供…

Ruby 安裝使用教程

一、Ruby 簡介 Ruby 是一種簡單快捷的面向對象腳本語言&#xff0c;以優雅、簡潔、易讀著稱。它常被用于 Web 開發&#xff08;如 Ruby on Rails 框架&#xff09;、自動化腳本、DevOps、命令行工具等領域。 二、Ruby 安裝教程 2.1 支持平臺 Ruby 支持跨平臺運行&#xff0c…

python | numpy小記(五):理解 NumPy 中的 `np.arccos`:反余弦函數

python | numpy小記&#xff08;五&#xff09;&#xff1a;理解 NumPy 中的 np.arccos&#xff1a;反余弦函數 一、函數簽名與核心參數二、數學定義與取值范圍三、基礎使用示例四、與 Python 內建 math.acos 的對比五、常見問題與注意事項六、典型應用場景1. 三維向量夾角計算…

華為云Flexus+DeepSeek征文 | 華為云ModelArts與Reor的完美結合:創建高效本地AI筆記環境

華為云FlexusDeepSeek征文 | 華為云ModelArts與Reor的完美結合&#xff1a;創建高效本地AI筆記環境 引言一、ModelArts Studio平臺介紹華為云ModelArts Studio簡介ModelArts Studio主要特點 二、Reor介紹Reor簡介Reor主要特點 三、安裝Reor工具下載Reor軟件安裝Reor工具 四、開…

【啟發式算法】Dynamic A*(D*)算法詳細介紹(Python)

&#x1f4e2;本篇文章是博主人工智能&#xff08;AI&#xff09;領域學習時&#xff0c;用于個人學習、研究或者欣賞使用&#xff0c;并基于博主對相關等領域的一些理解而記錄的學習摘錄和筆記&#xff0c;若有不當和侵權之處&#xff0c;指出后將會立即改正&#xff0c;還望諒…

報告怎么寫

替代方案&#xff08;按場景選擇&#xff09; 崗前準備階段 ? "熟悉業務流程/系統操作" ? "掌握XX工具/平臺的核心功能" ? "完成上崗前技術對接" 知識轉化場景 ? "梳理產品知識體系" ? "轉化技術文檔為實操方案" ? &…

大模型——怎么讓 AI 寫出好看有設計感的網頁

大模型——怎么讓 AI 寫出好看有設計感的網頁 你讓 AI 給你寫的網頁大概都是這樣的: 或者這樣: 好點的時候能這樣: 但都不夠高級,尤其是那個像引用一樣的邊框,太 AI 了。 今天教大家一個小技巧,寫出下面這樣的網頁: 或者這樣的

【Torch】nn.Linear算法詳解

1. 定義 nn.Linear 是 PyTorch 中最基礎的全連接&#xff08;fully‐connected&#xff09;線性層&#xff0c;也稱仿射變換層&#xff08;affine layer&#xff09;。它對輸入張量做一次線性變換&#xff1a; output x W T b \text{output} x W^{T} b outputxWTb 其中&a…