數據結構與算法-冒泡排序

引言

????????在數據結構與算法的世界里,冒泡排序作為基礎排序算法之一,以其直觀易懂的原理和實現方式,為理解更復雜的數據處理邏輯提供了堅實的入門階梯。盡管在實際應用中由于其效率問題不常被用于大規模數據的排序任務,但它對于每一位初學者構建扎實的算法思維框架至關重要。

一、冒泡排序的理論解析

????????冒泡排序的基本思想是通過不斷地遍歷待排序序列,并逐對比較相鄰元素,若前一個元素大于后一個元素(以升序為例),則交換它們的位置,就像氣泡在水中逐漸上浮至水面一樣,數組中的最大(或最小)元素經過一輪遍歷就會“浮”到正確位置。

冒泡排序的具體步驟如下:

  1. 從數組的第一個元素開始,對每一對相鄰元素進行比較。
  2. 如果當前元素比下一個元素大,則交換這兩個元素的位置。
  3. 對數組的所有元素執行以上操作,直到數組末尾。這樣第一輪結束時,最大的元素將被放置在數組的最后。
  4. 重復上述過程,但每次遍歷時無需考慮已經排好序的部分,即每次只需針對剩余未排序部分執行冒泡操作,直至整個數組完全有序。

二、冒泡排序的時間復雜度與優化策略

????????原始冒泡排序在最壞情況下的時間復雜度為O(n^2),在最好情況下(已排序數組)的時間復雜度為O(n)。為了提高效率,我們可以引入一種優化策略——設置一個標志位,記錄每輪循環是否發生過交換。如果某輪沒有發生任何交換,則說明數組已經完全有序,可以直接結束排序。

三、冒泡排序的過程圖解

圖解小結:

1.一共進行,數組的大小-1次大的循環

2.每一趟排序的次數在逐漸減少?

3.如果我們發現在某趟排序中,沒有發生一次交換,可以提前結束冒泡循環,這就是優化

四、冒泡排序的代碼實踐?

1.展示每一次冒泡排序過程

System.out.println("第一趟排序的效果");
//        驗證冒泡排序流程for (int i = 0; i < arr.length - 1; i++) {if (arr[j] > arr[j + 1]) {temp = arr[j];arr[j] = arr[j + 1];arr[j + 1] = temp;}}System.out.println(Arrays.toString(arr));System.out.println("第二趟排序的效果");
//        驗證冒泡排序流程for (int i = 0; i < arr.length - 1 - 1; i++) {if (arr[j] > arr[j + 1]) {temp = arr[j];arr[j] = arr[j + 1];arr[j + 1] = temp;}}System.out.println(Arrays.toString(arr));System.out.println("第三趟排序的效果");
//        驗證冒泡排序流程for (int i = 0; i < arr.length - 1 - 2; i++) {if (arr[j] > arr[j + 1]) {temp = arr[j];arr[j] = arr[j + 1];arr[j + 1] = temp;}}System.out.println(Arrays.toString(arr));System.out.println("第四趟排序的效果");
//        驗證冒泡排序流程for (int i = 0; i < arr.length - 1 - 3; i++) {if (arr[j] > arr[j + 1]) {temp = arr[j];arr[j] = arr[j + 1];arr[j + 1] = temp;}}System.out.println(Arrays.toString(arr));

2.總結規律得到過程?

//    由以上代碼分析可得,一個for循環的條件就相當于 arr.length - 1 - ifor (int i = 0; i < arr.length - 1; i++) {for (int j = 0; j < arr.length - 1 - i; j++) {if (arr[j] > arr[j + 1]) {temp = arr[j];arr[j] = arr[j + 1];arr[j + 1] = temp;}}}System.out.println(Arrays.toString(arr));

3.進行優化?

        //    代碼進行優化
//    目標:解決在一趟排序中,一次交換都沒有發生過,浪費開銷boolean flag = false;     //表示變量,表示是否進行交換for (int i = 0; i < arr.length - 1; i++) {for (int j = 0; j < arr.length - 1 - i; j++) {if (arr[j] > arr[j + 1]) {flag = true;temp = arr[j];arr[j] = arr[j + 1];arr[j + 1] = temp;}}System.out.printf("第%d趟排序后的數組為", i + 1);System.out.println(Arrays.toString(arr));if (!flag) {   //沒有交換過的情況直接結束本次循環break;} else {flag = false;   //重置flag,進行下次判斷}}

五、深入理解冒泡排序的價值

????????雖然在實際生產環境中,我們可能更多地會選擇如快速排序、歸并排序等高效算法,但冒泡排序的簡單性和直觀性使其成為教學和學習的理想選擇。它幫助我們掌握基本的排序概念,理解算法背后的設計思路,并啟示我們在面對性能瓶頸時尋求優化策略的重要性。同時,通過對冒泡排序的剖析,我們也能更深入地認識到數據結構與算法設計的核心原則:如何用簡潔而有效的邏輯來解決復雜的問題。

六、總結

????????冒泡排序雖然在性能上并非最優解,但它的簡單明了使得它成為數據結構與算法入門教學的理想工具。通過對冒泡排序的學習,我們能夠深刻理解排序算法的核心理念,即通過不斷的比較和交換,達到數據有序的目標。此外,冒泡排序的優化過程也啟示我們在設計和實現算法時,應注重分析問題本質,積極尋求效率提升的可能性。因此,無論是在理論學習還是實踐運用中,冒泡排序都發揮著承前啟后的重要作用,為深入探索更高級的排序算法奠定了堅實的基礎。

?

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

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

相關文章

【C++】set、multiset與map、multimap的使用

目錄 一、關聯式容器二、鍵值對三、樹形結構的關聯式容器3.1 set3.1.1 模板參數列表3.1.2 構造3.1.3 迭代器3.1.4 容量3.1.5 修改操作 3.2 multiset3.3 map3.3.1 模板參數列表3.3.2 構造3.3.3 迭代器3.3.4 容量3.3.5 修改操作3.3.6 operator[] 3.4 multimap 一、關聯式容器 談…

Hololens 2應用開發系列(1)——使用MRTK在Unity中設置混合現實場景并進行程序模擬

Hololens 2應用開發系列&#xff08;1&#xff09;——使用MRTK在Unity中進行程序模擬 一、前言二、創建和設置MR場景三、MRTK輸入模擬的開啟 一、前言 在前面的文章中&#xff0c;我介紹了Hololens 2開發環境搭建和項目生成部署等相關內容&#xff0c;使我們能生成一個簡單Ho…

Redis 之九:Spring Data Redis -- Redis Template 用法

SpringData Redis Spring Data Redis 是 Spring Data 項目的一部分&#xff0c;它為 Java 應用程序提供了一種便捷的方式來與 Redis 數據庫進行交互。 Spring Data Redis 提供了對 Redis 的抽象封裝&#xff0c;使得開發者能夠以面向對象的方式操作 Redis&#xff0c;并簡化了 …

matlab 寫入格式化文本文件

目錄 一、save函數 二、fprintf函數 matlab 寫入文本文件可以使用save和fprintf函數 save輸出結果: fprintf輸出結果: 1.23, 2.34, 3.45 4.56, 5.67, 6.78 7.89, 8.90, 9.01 可以看出fprintf輸出結果更加人性化,符合要求,下面分別介紹。 一、save函數 …

linux系統Jenkins工具介紹

Jenkins概念介紹 Jenkins概念Jenkins目的特性產品發布流程 Jenkins概念 Jenkins是一個功能強大的應用程序&#xff0c;允許持續集成和持續交付項目&#xff0c;無論用的是什么平臺。這是一個免費的源代碼&#xff0c;可以處理任何類型的構建或持續集成。集成Jenkins可以用于一些…

MQL5-MT5連接上國內期貨

主要原因是昨天在學習MACD時發現給的基礎代碼感覺不對&#xff0c;但無法證明&#xff0c;因為MT5接的都是外匯交易&#xff0c;數據和國內的文華啥的全對不上&#xff0c;便找了一些國內接CTP的&#xff0c;直接寫代碼有點麻煩&#xff0c;雖然之前對接過國內CTP的東西&#x…

AI入門筆記(三)

神經網絡是如何工作的 神經網絡又是如何工作的呢&#xff1f;我們用一個例子來解釋。我們看下面這張圖片&#xff0c;我們要識別出這些圖片都是0并不難&#xff0c;要怎么交給計算機&#xff0c;讓計算機和我們得出同樣的結果&#xff1f;難點就在于模式識別的答案不標準&…

十二、Nacos源碼系列:Nacos配置中心原理(四)- RefreshEvent 事件處理

前面文章&#xff0c;我們說到回調監聽器的方法中&#xff0c;主要就是發布了一個RefreshEvent事件&#xff0c;這個事件主要由 SpringCloud 相關類來處理。今天我們繼續分析后續的流程。 RefreshEvent 事件會由 RefreshEventListener 來處理&#xff0c;該 listener 含有一個 …

Object類方法

toString(): 返回對象的字符串表示形式。默認情況下&#xff0c;返回對象的類名和哈希碼的十六進制表示。 equals(Object obj): 比較兩個對象是否相等。默認情況下&#xff0c;這個方法比較的是兩個對象的引用是否相同&#xff0c;但是通常會在子類中重寫這個方法以實現自定義…

武器大師——操作符詳解(下)

目錄 六、單目操作符 七、逗號表達式 八、下標引用以及函數調用 8.1.下標引用 8.2.函數調用 九、結構體 9.1.結構體 9.1.1結構的聲明 9.1.2結構體的定義和初始化 9.2.結構成員訪問操作符 9.2.1直接訪問 9.2.2間接訪問 十、操作符的屬性 10.1.優先性 10.2.結合性 …

sql基本語法+實驗實踐

sql語法 注釋&#xff1a; 單行 --注釋內容# 注釋內容多行 /* 注釋內容 */數據定義語言DDL 查詢所有數據庫 show databases;注意是databases而不是database。 查詢當前數據庫 select database();創建數據庫 create database [if not exists] 數據庫名 [default charset 字符…

備戰藍橋杯Day22 - 計數排序

計數排序問題描述 對列表進行排序&#xff0c;已知列表中的數范圍都在0-100之間。設計時間復雜度為O(n)的算法。 比如列表中有一串數字&#xff0c;2 5 3 1 6 3 2 1 &#xff0c;需要將他們按照從小到大的次序排列&#xff0c;得到1 1 2 2 3 3 5 6 的結果。那么此時計數排序是…

一:面試流程

面試 項目介紹功能測試接口測試性能測試測試用例 項目介紹 南網智搜是南方電網公司研發的搜索引擎&#xff0c;主要場景Web 端場景有搜索頻道、個人中心、和一些積分活動等&#xff0c;我在里面主要負責功能測試&#xff0c;接口測試&#xff0c;性能測試&#xff0c;壓力測試…

Jetson Xavier NX 開發板Ubuntu18.04 安裝arduino IDE詳細步驟

Jetson 平臺是arch架構&#xff0c;官網上面幾乎都是x86或者arm64的這兩種錯誤版本都存在匹配問題無法使用&#xff0c;不要下載不要下載&#xff01; uname -a #版本查詢1.正確下載打開方式 https://downloads.arduino.cc/arduino-1.8.19-linuxaarch64.tar.xz選擇自己想要下…

LeetCode #104 二叉樹的最大深度

104. 二叉樹的最大深度 題目 二叉樹的 最大深度 是指從根節點到最遠葉子節點的最長路徑上的節點數。 示例 1&#xff1a; 輸入&#xff1a;root [3,9,20,null,null,15,7] 輸出&#xff1a;3 示例 2&#xff1a; 輸入&#xff1a;root [1,null,2] 輸出&#xff1a;2 分析 …

【Godot4自學手冊】第十九節敵人的血量顯示及掉血特效

這一節&#xff0c;我主要學習敵人的血量顯示、掉血顯示和死亡效果。敵人的血量顯示和主人公的血量顯示有所不同&#xff0c;主要是在敵人頭頂有個紅色的血條&#xff0c;受到攻擊敵人的血條會減少&#xff0c;并且有掉血數量的文字顯示&#xff0c;效果如下&#xff1a; 一、…

《中華人民共和國消防法》(2021年修訂版)解讀

單選題&#xff08;共7題&#xff0c;每題5分&#xff09; 1、舉辦大型群眾性活動&#xff0c;承辦人應當依法向&#xff08;&#xff09;申請安全許可。 正確答案&#xff1a;B、公安機關 2、違反消防安全規定進入生產、儲存易燃易爆危險品場所的&#xff0c;情節嚴重的要處…

基于springboot+vue的醫院后臺管理系統

博主主頁&#xff1a;貓頭鷹源碼 博主簡介&#xff1a;Java領域優質創作者、CSDN博客專家、阿里云專家博主、公司架構師、全網粉絲5萬、專注Java技術領域和畢業設計項目實戰&#xff0c;歡迎高校老師\講師\同行交流合作 ?主要內容&#xff1a;畢業設計(Javaweb項目|小程序|Pyt…

胎神游戲集第一期

目錄 一、變色小跳龍 二、超級按鈕 三、超級迷宮 四 、城市守衛戰 五、 憤怒的小胎 既然是胎神游戲集&#xff0c;那當然要先感謝我們的胎神大大了 胎神洛谷名&#xff1a;TSzza 好了&#xff0c;言歸正傳&#xff0c;知道你們不喜歡啰嗦&#xff0c;直接上代碼 一、…

SMBGhost漏洞技術分析與防御方案

事件分析 最近國內外各安全廠商都發布了SMBGhost(CVE-2020-0796)漏洞的預警報告和分析報告&#xff0c;筆者利用周末休息時間也研究了一下&#xff0c;就算是做一個筆記了&#xff0c;分享給大家一起學習下&#xff0c;目前外面研究的POC大部分是通過SMB壓縮數據包長度整數溢出…