經典算法之美:冒泡排序的優雅實現

經典算法之美:冒泡排序的優雅實現

  • 基本概念
  • 工作原理
    • 介紹
    • 具體實現
  • 代碼實現
  • 總結

基本概念

冒泡排序是一種簡單的排序算法,通過重復比較相鄰的元素并交換它們的位置來實現排序。它的名稱來源于較小的元素像氣泡一樣逐漸“浮”到數組的頂端。

工作原理

介紹

冒泡排序是交換排序的一種,了解其基本思想對學習這種算法至關重要。

所謂交換,就是根據序列中兩個記錄鍵值的比較結果來對換這兩個記錄在序列中的位置,交換排序的特點是:將鍵值較大的記錄向序列的尾部移動,鍵值較小的記錄向序列的前部移動。重復這個過程直到整個數組有序。

具體實現

在這里插入圖片描述

以該數組為例,我們每次只關注相鄰兩個元素的大小關系

  1. 我們先關注3和44,很明顯,此時的數組[3,44]是有序的,無需交換
    在這里插入圖片描述

  2. 此時,44和38需要交換
    在這里插入圖片描述
    在這里插入圖片描述
    此時數組[3,38,44]有序,從44的位置繼續向后比較

  3. 找到44和5時同理,需要交換44和5保證升序順序
    在這里插入圖片描述
    在這里插入圖片描述
    你可能疑問?此時數組[3,38,5,44]不是有序的!
    不要緊,我們先繼續往后交換

  4. 我們省略幾步,直接來看這趟比較的結束狀態
    在這里插入圖片描述
    此時我們發現,數組中最大的元素47來到了最后面,這就是單趟冒泡排序的效果,一次選出數組中最大或最小的一個數放到應該在的位置上

  5. 我們來分析此時的數組
    在這里插入圖片描述
    數組被紅線分割,紅線左邊為無序區,右邊為有序區。
    此時的效果可能不明顯,我們再模擬幾次交換
    在這里插入圖片描述
    目前我們又執行了兩次交換,可以看到:有序區的在增加,無序區在減少
    意識到這點之后,你就已經明白了冒泡排序的原理了:通過重復遍歷無序區,對相鄰元素依次比較并交換逆序對,使當前無序區的最值逐步‘浮’到其最終位置;每輪結束后,無序區長度減 1;直至無序區僅剩 1 個元素時,數組完全有序。

代碼實現

因為冒泡排序是較為簡單的經典排序算法,我們直接來看代碼實現。

void BubbleSort(int arr[], int n)
{if (n <= 1) return;int i, j;for (int i = n - 1; i >= 0; i--){for (int j = 0; j < i; j++){if (arr[j] > arr[j + 1]){swap(arr[j], arr[j + 1]);}}}
}

最壞情況:數組完全逆序,需要進行 n(n-1)/2 次比較和交換,時間復雜度O(N^2)

此時可以對冒泡排序做出優化

void BubbleSort(int arr[], int n)
{if (n <= 1) return;int i, j;for (int i = n - 1; i >= 0; i--){bool flag = false;for (int j = 0; j < i; j++){if (arr[j] > arr[j + 1]){swap(arr[j], arr[j + 1]);flag = true;}}if (flag == false)break;}
}

通過提前終止優化,如果在某次循環中沒有發生元素交換,代表此時數組已經有序,直接退出。此時為最優情況,僅需一次遍歷,時間復雜度為 O(N)

總結

冒泡排序是入門級排序算法,核心是通過相鄰元素比較交換,讓最值逐步 “浮” 到對應位置,隨無序區收縮實現有序。?
其時間復雜度為 O (n2)(優化后最好情況 O (n)),空間復雜度 O (1),是穩定排序。優勢在于簡單易實現,適配接近有序數據;但效率偏低,僅適合小規模場景。?
雖被高效算法替代,但其迭代邏輯仍是理解排序本質的基礎

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

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

相關文章

click和touch事件觸發順序 糊里糊涂解決的奇怪bug

問題詳情 在嵌入式硬件設備里&#xff0c;測試 “點擊input密碼框&#xff0c;彈出第三方自帶鍵盤&#xff0c;點擊密碼框旁的小眼睛&#xff0c;切換輸入內容加密狀態&#xff0c;鍵盤收起/彈出狀態不變” 的功能邏輯&#xff1b;實際情況卻是 “點擊鍵盤或input框之外的任何地…

【0基礎PS】Photoshop (PS) 理論知識

目錄前言一、Photoshop 核心概念與定位?二、圖像基礎理論?三、圖層理論&#xff1a;PS 的核心工作機制?四、選區與蒙版?五、調色核心理論?六、常用文件格式?學習建議?總結前言 在數字圖像編輯領域&#xff0c;Photoshop&#xff08;簡稱 PS&#xff09;無疑是行業標桿級…

數據庫 設計 pdm comment列表顯示和生成建表sql

按如下步驟 生成見建表語句 comment非空使用comment 生成字段注釋&#xff0c; 空的時候使用name 生成字段注釋 sql腳本模板編輯 參考 PowerDesigner生成mysql字段comment 注釋-騰訊云開發者社區-騰訊云 版本不同這邊的設置不同 這個勾打上

嵌入式基礎知識復習(C語言)

知識擴展7.28 嵌入式產品特點、開發環境、計算機組成、Linux終端初識1、嵌入式產品。特點&#xff1a;低功耗、根據用戶需求定制。硬件&#xff1a;arm處理器。軟件&#xff1a;Linux操作系統arm架構&#xff1a;精簡指令集、低功耗&#xff08;移動/嵌入式&#xff09;。 …

LeetCode Hot 100 尋找兩個正序數組的中位數

給定兩個大小分別為 m 和 n 的正序&#xff08;從小到大&#xff09;數組 nums1 和 nums2。請你找出并返回這兩個正序數組的 中位數 。算法的時間復雜度應該為 O(log (mn)) 。示例 1&#xff1a;輸入&#xff1a;nums1 [1,3], nums2 [2] 輸出&#xff1a;2.00000 解釋&#x…

監控場景視頻質量異常修復:陌訊動態增強算法實戰解析

原創聲明&#xff1a;本文為原創技術解析&#xff0c;核心技術參數與架構引用自《陌訊技術白皮書》&#xff0c;禁止未經授權轉載。一、行業痛點&#xff1a;視頻質量異常的連鎖難題在安防監控、智慧交通等場景中&#xff0c;視頻質量異常已成為 AI 分析的主要瓶頸。據行業報告…

一個簡單的mvvm示例與數據雙向綁定

這就是一個簡單的數據雙向綁定的demo&#xff0c;參考即可&#xff08;cmakelist我沒按他的寫&#xff0c;但是大差不差&#xff09; 目錄 1.示例demo File: CMakeLists.txt File: main.cpp File: model/physiologymodel.cpp File: viewmodel/physiologyviewmodel.h Fil…

哈希的概念及其應用

哈希的概念及其應用哈希概念常見的哈希其他哈希字符串哈希&#xff08;算法競賽常用&#xff09;字符串哈希OJP3370 【模板】字符串哈希 - 洛谷P10468 兔子與兔子 - 洛谷哈希沖突哈希函數設計原則哈希沖突解決方法—閉散列閉散列的線性探測閉散列的二次探測哈希沖突解決方法—開…

【分布式的個人博客部署】

綜合項目-搭建個人博客一、運行環境二、基礎配置三、業務需求第一步&#xff1a;準備工作1、配置靜態IP2、修改hosts映射3、開啟防火墻4、時間同步5、配置免密ssh登錄第二步&#xff1a;環境搭建1、Server-web端安裝LNMP環境軟件2、Server-NFS-DNS端上傳博客軟件3、Server-NFS-…

藍橋杯----DS18B20溫度傳感器

&#xff08;二&#xff09;、溫度傳感器1、One-Wire總線One-Wire總線利用一根線實現雙向通信。因此其協議對時序的要求較嚴格&#xff0c;如應答等時序都有明確的時間要求。基本的時序包括復位及應答時序、寫一位時序讀一位時序。單總線即只有一根數據線&#xff0c;系統中的數…

科技賦能成長 腦力啟迪未來

——西安臻昊科技與秦嶺云數智共筑腦科學教育新生態 2025年6月26日&#xff0c;西安臻昊科技&#xff08;集團&#xff09;有限責任公司與秦嶺云數智&#xff08;陜西&#xff09;科技有限公司正式簽署腦象評測技術戰略合作協議&#xff0c;雙方將依托技術互補與資源協同&#…

Docker部署的PostgreSQL慢查詢日志配置指南

目錄 1. 核心步驟 1.1 修改配置文件 1.2 動態加載配置&#xff08;無需重啟容器&#xff09; 1.3 驗證配置生效 1.3.1 查看參數 1.3.2 執行測試慢查詢 2. 高級用法 2.1 使用分析工具 2.2 啟用擴展 3. 注意事項 3.1 日志目錄權限 3.2 性能影響 配置Docker部署的Pos…

C# 入門教程(四)委托詳解

文章目錄1、什么是委托2、委托的聲明&#xff08;自定義委托&#xff09;3、委托的使用3.1 實例:把方法當作參數傳給另一個方法3.2 注意:難精通易使用功能強大東西&#xff0c;一旦被濫用則后果非常嚴重4、委托的高級使用4.1 多播&#xff08;multicast&#xff09;委托4.2隱式…

React的基本語法和原理

3. React條件渲染某些情況下&#xff0c;姐妹的內容會根據不同的情況顯示不同的內容&#xff0c;或者決定是否渲染某部分內容&#xff1a; 在React中&#xff0c;所有的條件判斷和普通的JavaScript代碼一致&#xff1b;常見的條件渲染的方式有哪些&#xff1f;方式一&#xff1…

如何在 Gradle 項目中添加依賴?(以添加 AndroidX 版本的 RecyclerView 為例)

1. 確保項目已啟用 AndroidX RecyclerView 的現代版本屬于 AndroidX 庫&#xff0c;需確保項目已啟用 AndroidX&#xff1a; 在 gradle.properties 中應有以下配置&#xff08;通常新建項目默認開啟&#xff09;&#xff1a;android.useAndroidXtrue android.enableJetifiert…

深度學習與圖像處理 | 基于PaddlePaddle的梯度下降算法實現(線性回歸投資預測)

演示基于PaddlePaddle自動求導技術實現梯度下降&#xff0c;簡化求解過程。01、梯度下降法梯度下降法是機器學習領域非常重要和具有代表性的算法&#xff0c;它通過迭代計算來逐步尋找目標函數極小值。既然是一種迭代計算方法&#xff0c;那么最重要的就是往哪個方向迭代&#…

負載均衡集群HAproxy

HAProxy 簡介HAProxy 是一款高性能的負載均衡器和代理服務器&#xff0c;支持 TCP 和 HTTP 應用。廣泛用于高可用性集群&#xff0c;能夠有效分發流量到多個后端服務器&#xff0c;確保服務的穩定性和可擴展性。HAProxy 核心功能負載均衡&#xff1a;支持輪詢&#xff08;round…

重生之我在10天內卷贏C++ - DAY 1

坐穩了&#xff0c;我們的C重生之旅現在正式發車&#xff01;請系好安全帶&#xff0c;前方高能&#xff0c;但絕對有趣&#xff01;&#x1f680; 重生之我在10天內卷贏C - DAY 1導師寄語&#xff1a;嘿&#xff0c;未來的編程大神&#xff01;歡迎來到C的世界。我知道&#x…

[mind-elixir]Mind-Elixir 的交互增強:單擊、雙擊與鼠標 Hover 功能實現

[mind-elixir]Mind-Elixir 的交互增強&#xff1a;單擊、雙擊與鼠標 Hover 功能實現 功能簡述 通過防抖&#xff0c;實現單擊雙擊區分通過mousemove事件&#xff0c;實現hover效果 實現思路 &#xff08;一&#xff09;單擊與雙擊事件 功能描述 單擊節點時&#xff0c;可以觸發…

c++-迭代器類別仿函數常用算法函數

C常用算法函數 1. 前置知識 1.1 迭代器的類別 C中&#xff0c;迭代器是 STL 容器庫的核心組件之一&#xff0c;具有舉足輕重的作用&#xff0c;它提供了一種 統一的方式來訪問和遍歷容器&#xff0c;而無需關心底層數據結構的具體實現。迭代器類似指針&#xff0c;但比指針更通…