七大經典排序算法——冒泡排序

文章目錄

  • 📑冒泡排序介紹
  • 🌤?代碼實現
  • 🌤?做個簡單的優化
  • 🌤?復雜度和穩定性分析
  • ??結語


📑冒泡排序介紹

冒泡排序是一種簡單但效率較低的排序算法。它重復地比較相鄰的兩個元素,如果順序不對則交換它們,直到所有元素都被比較過一次。這樣每一輪比較過后,最大的元素就會"冒泡"到最后面。接著,算法將會忽略最后一個元素,重復上述比較和交換的過程,直到所有元素都按照順序排列。

? 冒泡排序算法的步驟如下:

  1. 從數組的第一個元素開始,依次比較相鄰的兩個元素。
  2. 如果前一個元素大于后一個元素,交換它們的位置。
  3. 繼續比較下一對相鄰元素,直到最后一個元素。
  4. 重復以上步驟,每一輪比較都會將最大的元素"冒泡"到最后面。
  5. 當比較結束時,此時數組已經排好序,排序結束。

動圖演示如下:
在這里插入圖片描述

🌤?代碼實現

🌳C語言版

// 交換函數,用于交換數組中兩個元素的位置
void swap(int* arr, int i, int j) {int tmp = arr[i];  // 將第一個元素的值存儲在臨時變量 tmp 中arr[i] = arr[j];   // 將第二個元素的值賦給第一個元素的位置arr[j] = tmp;      // 將臨時變量 tmp 的值賦給第二個元素的位置
}// 冒泡排序函數,用于對數組進行排序
void bobbleSort(int* arr, int n) {// 外層循環控制需要遍歷的輪數,共進行 n-1 次遍歷for (int i = 0; i < n - 1; i++) {// 內層循環進行相鄰元素的比較和交換// j 的范圍是從 0 到 n-i-1,這樣每次內層循環可以比較并將最大值移動到最后for (int j = 0; j < n - i - 1; j++) { // j 進循環的條件容易出錯,特殊標記下// 如果前一個元素比后一個元素大,交換它們if (arr[j] > arr[j + 1]) {swap(arr, j, j + 1);  // 調用交換函數進行交換}}}
}

🌳java版

// 交換函數,用于交換數組中兩個元素的位置
private static void swap(int[] array, int i, int j) {int tmp = array[i]; // 將第一個元素的值存儲在臨時變量 tmp 中array[i] = array[j]; // 將第二個元素的值賦給第一個元素的位置array[j] = tmp; // 將臨時變量 tmp 的值賦給第二個元素的位置
}// 冒泡排序函數,用于對數組進行排序
public static void bubbleSort(int[] array) {// 外層循環控制需要遍歷的輪數for (int i = 0; i < array.length; i++) {// 內層循環進行相鄰元素的比較和交換for (int j = i + 1; j < array.length; j++) {// 如果前一個元素比后一個元素大,交換它們if (array[i] > array[j]) {swap(array, i, j); // 調用交換函數進行交換}}}
}

🌤?做個簡單的優化

可以在內層循環中定義一個變量 flag:用于檢測這一輪內層循環是否發生了交換。初始值設為 1。
如果在一輪內層循環中沒有發生交換(flag 仍為 1),說明數組已經有序,跳出循環即可。
🌳C語言版

// 交換函數,用于交換數組中兩個元素的位置
void swap(int* arr, int i, int j) {int tmp = arr[i];  // 將第一個元素的值存儲在臨時變量 tmp 中arr[i] = arr[j];   // 將第二個元素的值賦給第一個元素的位置arr[j] = tmp;      // 將臨時變量 tmp 的值賦給第二個元素的位置
}// 冒泡排序函數,用于對數組進行排序
void bobbleSort(int* arr, int n) {// 外層循環控制需要遍歷的輪數,共進行 n-1 次遍歷for (int i = 0; i < n - 1; i++) {int flag = 1; // 標記用于檢測這一輪是否發生了交換// 內層循環進行相鄰元素的比較和交換// j 的范圍是從 0 到 n-i-1,這樣每次內層循環可以比較并將最大值移動到最后for (int j = 0; j < n - i - 1; j++) { // j 進循環的條件容易出錯,特殊標記下// 如果前一個元素比后一個元素大,交換它們if (arr[j] > arr[j + 1]) {swap(arr, j, j + 1); // 調用交換函數進行交換flag = 0; // 發生交換后,將標記設置為 0}}// 如果沒有發生交換,說明數組已經有序,提前退出排序if (flag) {break;}}
}

🌳java版


// 交換函數,用于交換數組中兩個元素的位置
private static void swap(int[] array, int i, int j) {int tmp = array[i];  // 將第一個元素的值存儲在臨時變量 tmp 中array[i] = array[j]; // 將第二個元素的值賦給第一個元素的位置array[j] = tmp;      // 將臨時變量 tmp 的值賦給第二個元素的位置
}public static void bubbleSort(int[] array) {// 外層循環控制需要遍歷的輪數,共進行 array.length 次遍歷for (int i = 0; i < array.length; i++) {boolean flg = true; // 標記用于檢測這一輪是否發生了交換// 內層循環進行相鄰元素的比較和交換// j 的范圍是從 i+1 到 array.length,注意這里的起始點是 i+1for (int j = i + 1; j < array.length; j++) {// 如果前一個元素比后一個元素大,交換它們if (array[i] > array[j]) {swap(array, i, j); // 調用交換函數進行交換flg = false; // 發生交換后,將標記設置為 false}}// 如果沒有發生交換,說明數組已經有序,提前退出排序if (flg) {break;}}
}

🌤?復雜度和穩定性分析

時間復雜度分析:在最壞的情況下,冒泡排序需要進行n-1輪比較,每輪比較需要進行n-i次。因此,總的比較次數為(n-1) + (n-2) + … + 2 + 1 = n(n-1)/2,近似為O(n2)。

空間復雜度分析:使用了常數個變量,因此空間復雜度為O(1)

什么是穩定性?
答:穩定性指的是相同的數據所在的位置經過排序后是否發生變化。換句話說就是大小相同的兩個值在排序之前和排序之后的先后順序不變,這就是穩定的。

穩定性分析:冒泡排序將小的元素往前調或者把大的元素往后調;比較的是相鄰的兩個元素,交換也發生在這兩個元素之間;因為相等的元素不會進行交換,所以穩定。

總結: 冒泡排序的時間復雜度為O(N2),空間復雜度為O(1),而且是穩定的排序。


??結語

請給自己些耐心,不要急于求成。
山外青山樓外樓,莫把百尺當盡頭。
保持空杯心態加油努力吧!


都看到這里啦!真棒(*^▽^*)

可以給作者一個免費的贊贊嗎,這將會鼓勵我繼續創作,謝謝大家

如有紕漏或錯誤,歡迎指正


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

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

相關文章

C++ socket epoll IO多路復用

IO多路復用通常用于處理單進程高并發&#xff0c;在Linux中&#xff0c;一切皆文件&#xff0c;一個socket連接會對應一個文件描述符&#xff0c;在監聽多個文件描述符的狀態應用中epoll相對于select和poll效率更高 epoll本質是系統在內核維護了一顆紅黑樹&#xff0c;監聽的文…

Linux中bash腳本怎么表示一個字符串變量

Linux中bash腳本怎么表示一個字符串變量 在Bash腳本中&#xff0c;你可以使用單引號&#xff08;&#xff09;或雙引號&#xff08;"&#xff09;來表示一個字符串變量。以下是兩種方式的示例&#xff1a; 使用單引號&#xff08;&#xff09;&#xff1a; my_variable…

flink 和 clipper搭配使用

Flink是一個用于流處理和批處理的開源框架&#xff0c;可以實時數據處理和分析。 Clipper 是一個用于機器學習模型服務化的開源框架&#xff0c;能夠輕松部署和管理機器學習模型&#xff0c;使模型可以通過統一的接口提供在線推理服務。 flink和clipper搭配使用&#xff1a; …

Leetcode | 5-21| 每日一題

2769. 找出最大的可達成數字 考點: 暴力 數學式子計算 思維 題解 通過式子推導: 第一想法是二分確定區間在區間內進行查找是否符合條件的, 本題最關鍵的便是 條件確定 , 第二種方法: 一般是通過數學公式推導的,這種題目我稱為數學式編程題 代碼 條件判斷式 class Solution { …

需求分析的任務

1 確定對系統的綜合要求 雖然功能需求是對軟件系統的一項基本需求&#xff0c;但卻并不是唯一的需求。通常對軟件系統有下述幾方面的綜合要求。 1&#xff0e;功能需求 這方面的需求指定系統必須提供的服務。通過需求分析應該劃分出系統必須完成的所有功能。 2&#xff0e;性能…

MacBook 怎么玩Windows游戲 蘋果筆記本怎么玩游戲?mac上如何玩windows游戲

傳統上&#xff0c;Mac 不被認為是好的游戲機。然而&#xff0c;蘋果已經開始在 Mac 上的游戲上投入更多精力&#xff0c;特別是自從轉向蘋果芯片以來。這使得 Mac 游戲的本機移植數量和模擬 Windows 游戲的能力都得到了顯著提高。 方法一&#xff1a;Boot Camp 1、Boot Camp是…

SpirngMVC框架學習筆記(一):SpringMVC基本介紹

1 SpringMVC 特點&概述 SpringMVC 從易用性&#xff0c;效率上 比曾經流行的 Struts2 更好 SpringMVC 是 WEB 層框架&#xff0c;接管了 Web 層組件, 比如控制器, 視圖, 視圖解析, 返回給用戶的數據格式, 同時支持 MVC 的開發模式/開發架構SpringMVC 通過注解&#xff0c;…

Java數據結構和算法(B樹)

前言 B樹又叫平衡的多路搜索樹&#xff1b;平衡的意思是又滿足平衡二叉樹的一些性質&#xff0c;左樹大于右樹&#xff1b; 多路意思是&#xff0c;可以多個結點&#xff0c;不再是像二叉樹只有兩個結點&#xff1b; 實現原理 B樹是一種自平衡的搜索樹&#xff0c;通常用于實…

MySQL和MongoDB數據庫的區別

MySQL和MongoDB數據庫的區別 隨著大數據和云計算技術的興起&#xff0c;數據庫的選擇成為開發者和架構師必須面對的重要決策。MySQL和MongoDB作為關系型數據庫和非關系型數據庫的代表&#xff0c;在各自領域都有著廣泛的應用。本文將從多方面詳細比較MySQL和MongoDB&#xff0…

MATLAB:插值函數之interp與griddata

MATLAB 提供了多種插值函數來處理不同維度的數據。其中&#xff0c;interp1、interp2 和 griddata 是常用的插值函數&#xff0c;分別用于一維、二維和多維&#xff08;不規則&#xff09;數據的插值。 之前有對interp1進行過詳細介紹&#xff0c;如需詳細了解&#xff0c;請查…

會聲會影調速怎么用 會聲會影如何調整音頻速度

會聲會影是一款功能強大的視頻編輯軟件&#xff0c;可以幫助我們輕松的實現剪輯。 會聲會影的操作簡單易懂&#xff0c;界面簡潔明快。適合家庭使用&#xff0c; 我們使用會聲會影可以在家就能將視頻剪輯成好萊塢大片。但是在使用的過程中&#xff0c;仍然會遇到一些操作上的問…

洛谷 P3803 【模板】多項式乘法(FFT)

【模板】多項式乘法&#xff08;FFT&#xff09; 題目背景 這是一道多項式乘法模板題。 注意&#xff1a;本題并不屬于中國計算機學會劃定的提高組知識點考察范圍。 題目描述 給定一個 n n n 次多項式 F ( x ) F(x) F(x)&#xff0c;和一個 m m m 次多項式 G ( x ) G(…

C語言--指針數組和數組指針的區別

指針數組 就是一個數組&#xff0c;由指針構成的數組&#xff0c;每一個元素都是指針&#xff0c;每個指針可以指向不同的內存地址&#xff0c;這些地址可以是數組、變量。 int var1 10; int var2 20; int var3 30;int *ptrArray[3]; // 定義一個指針數組&#xff0c;包含…

2024年上半年軟件系統架構師論文【回憶版】

文章目錄 考試時間考試地點案例分析1、微服務架構的優點和缺點2、質量屬性的6個元素3、分布式鎖 Redis的缺點4、MongoDB 存儲矢量圖的優勢 論文回憶版論文一、論單元測試的設計與應用論文二、論大數據模型的設計與應用論文三、論模型驅動的架構設計及應用論文四、論云原生運維的…

Mybatis-Plus-Join

1. 簡介 官網 https://mybatisplusjoin.com/ 2. 基本用法 步驟&#xff1a; 添加依賴 <!--mybatis-plus-join--> <dependency><groupId>com.github.yulichang</groupId><artifactId>mybatis-plus-join-boot-starter</artifactId><ve…

探索LangGraph:如何創建一個既智能又可控的航空客服AI

這種設計既保持了用戶控制權&#xff0c;又確保了對話流程的順暢。但隨著工具數量的增加&#xff0c;單一的圖結構可能會變得過于復雜。我們將在下一節中解決這個問題。 第三部分的圖將類似于下面的示意圖&#xff1a; 狀態定義 首先&#xff0c;定義圖的狀態。我們的狀態和L…

homography原理和圖像相似度計算

1. homography 講homography原理 講homography應用 2. 圖像相似度計算 20230621-計算兩幅圖像的相似度 20221205-有史以來最全的圖像相似度算法 20231112-圖像相似度對比方法

C++:List的使用和模擬實現

???學習的道路很枯燥&#xff0c;希望我們能并肩走下來! 文章目錄 目錄 文章目錄 前言 一 list的介紹及使用 1.1 list的介紹 1.2 list的使用 1.2.1 list的構造 1.2.2 list iterator的使用 1.2.3 list capacity 1.2.4 list element access 1.2.5 list modifiers …

golang+redis的延時隊列

網址 https://github.com/cfanbo/delay-queue-redis 代碼結構很簡單&#xff0c;簡單代表著自由度很高&#xff0c;使用過程中出現問題也很好修改。 我很喜歡這樣的代碼&#xff0c;至少我看的懂&#xff0c;該有的都有。 //package main // //import ( // "context&q…