經典再現,回顧常見排序算法之冒泡排序,附Java源碼及優化改進實現

回顧一下排序算法,老酒裝新瓶,給自己的技能點做個回放。

排序(Sorting) 是計算機程序設計中的一種重要操作,它的功能是將一個數據元素(或記錄)的任意序列,重新排列成一個有序的序列,也可以理解為高矮個站隊。

衡量排序算法的兩個指標,時間復雜度 和 穩定性。

舉個例子,如果我們的數據是:3 5 4 2 2, 穩定的排序最后的倆個2在排好序后他們的原始前后順序是不會變的(第一個2還在第二個2的前面,有點繞,你可以理解為小明和小強一樣高,最開始小明在小強的前面,排完序之后,小明還在小強前面,就屬于穩定的排序),不穩定的排序最后兩個2的順序可能交換(也就是可能小明在前,也可能小強在前)。

時間復雜度先跳過哈,我回頭單獨寫一篇文章介紹,本文主要介紹和實操“冒泡排序”。

介紹

冒泡排序是將比較大的數字移到序列的后面,較小的移到前面。

從第一個開始,第一個和第二個比,誰高(大)誰站后面(兩個人(數)的位置交換,不是最后面),當前第二個再與第三個比,依次進行,一輪下來之后,篩選出來最高個(大)的人(數)。

上面就表示第一輪結束了,第二輪和第一輪一樣,只是最后一個人(數)已經排好了,不用管他了。

經過 N-1 輪之后,排序完成。

N 個人,經過 N-1 輪,相當于 N*(N-1)=N^2-N, 時間復雜度取最大的 O(n^2)

實例

原始數據:

3 5 2 6 2

第一輪

比較 3 和 5,5 大于 3 ,不需交換

3 5 2 6 2

繼續比較 5 和 2,5 大于 2,交換位置

3 2 5 6 2

繼續比較 5 和 6,6 大于 5,不需交換

3 2 5 6 2

繼續比較 6 和 2,6 大于 2,交換位置

3 2 5 2 6

6 移到最后,兩個2都分別向前移動。

第二輪

比較 3 和 2, 3 大于 2,交換位置

2 3 5 2 6

比較 3 和 5, 5 大于 3,不需交換

2 3 5 2 6

比較 5 和 2, 5 大于 2,交換位置

2 3 2 5 6

不需比較 5 和 6

第三輪

比較 2 和 3, 3 大于 2,不需交換

2 3 2 5 6

比較 3 和 2, 3 大于 2,交換位置

2 2 3 5 6

不需比較了

第四輪

比較 2 和 2,不需交換

2 2 3 5 6

四輪結束,最終的結果:

2 2 3 5 6

Java 實現

public?class?Bubble?{/***?冒泡排序*/public?static?int[]?sort(int[]?array)?{int?temp;//?第一層循環表明比較的輪數,?比如?length?個元素,比較輪數為?length-1?次(不需和自己比)for?(int?i?=?0;?i?<?array.length?-?1;?i++)?{System.out.println("第"?+?(i?+?1)?+?"輪開始");//?第二層循環,每相鄰的兩個比較一次,次數隨著輪數的增加不斷減少,每輪確定一個最大的,不需比較那個最大的for?(int?j?=?0;?j?<?array.length?-?1?-?i;?j++)?{System.out.println("第"?+?(i?+?1)?+?"輪,第"?+?(j?+?1)?+?"次比較:");if?(array[j?+?1]?<?array[j])?{temp?=?array[j];array[j]?=?array[j?+?1];array[j?+?1]?=?temp;}for?(int?k?:?array)?{System.out.print(k?+?"?");}System.out.println();}System.out.println("結果:");for?(int?k?:?array)?{System.out.print(k?+?"?");}System.out.println();}return?array;}public?static?void?main(String[]?args)?{int[]?array?=?{3,?5,?2,?6,?2};int[]?sorted?=?sort(array);System.out.println("最終結果");for?(int?i?:?sorted)?{System.out.print(i?+?"?");}}}

輸出結果:

第1輪開始
第1輪,第1次比較:
3?5?2?6?2?
第1輪,第2次比較:
3?2?5?6?2?
第1輪,第3次比較:
3?2?5?6?2?
第1輪,第4次比較:
3?2?5?2?6?
結果:
3?2?5?2?6?
第2輪開始
第2輪,第1次比較:
2?3?5?2?6?
第2輪,第2次比較:
2?3?5?2?6?
第2輪,第3次比較:
2?3?2?5?6?
結果:
2?3?2?5?6?
第3輪開始
第3輪,第1次比較:
2?3?2?5?6?
第3輪,第2次比較:
2?2?3?5?6?
結果:
2?2?3?5?6?
第4輪開始
第4輪,第1次比較:
2?2?3?5?6?
結果:
2?2?3?5?6?
最終結果
2?2?3?5?6?

優化改進

對冒泡排序常見的改進方法是加入一標志性變量 pos ,用于標志某一趟排序過程中是否有數據交換,如果進行某一趟排序時并沒有進行數據交換(都不需要交換,肯定排好了),則說明數據已經按要求排列好,可立即結束排序,避免不必要的比較過程。

設置一標志性變量 pos,用于記錄每趟排序中最后一次進行交換的位置(后面有多個沒有發生交換,說明后面已經排好了)。由于 pos 位置之后的記錄均已交換到位,故在進行下一趟排序時只要排到 pos 位置即可。

怎么理解呢?

3 2 4 5 6 為例

第一輪排序,發生交換的位置僅僅是 3 和 2, 則 pos 是 0(索引位置從0開始)

直接一輪就結束了,而不用傻傻的再跑4輪。

代碼實現:

public?class?Bubble?{/***?冒泡排序(優化改進版)*/public?static?int[]?sort(int[]?array)?{int?temp;int?time?=?1;for?(int?i?=?array.length?-?1;?i?>?0;?)?{System.out.println("第"?+?time?+?"輪開始");int?pos?=?0;//?第二層循環,每相鄰的兩個比較一次,次數隨著輪數的增加不斷減少,每輪確定一個最大的,不需比較那個最大的for?(int?j?=?0;?j?<?i;?j++)?{System.out.println("第"?+?time?+?"輪,第"?+?(j?+?1)?+?"次比較:");if?(array[j?+?1]?<?array[j])?{//?記錄最后一次交換位置的索引,下一輪只需排序到?pos?位置pos?=?j;temp?=?array[j];array[j]?=?array[j?+?1];array[j?+?1]?=?temp;}for?(int?k?:?array)?{System.out.print(k?+?"?");}System.out.println();}//?之前是?i--,?優化后直接跳到最后交換位置的索引i?=?pos;time++;System.out.println("結果:");for?(int?k?:?array)?{System.out.print(k?+?"?");}System.out.println();}return?array;}public?static?void?main(String[]?args)?{int[]?array?=?{3,?2,?4,?5,?6};int[]?sorted?=?sort(array);System.out.println("最終結果");for?(int?i?:?sorted)?{System.out.print(i?+?"?");}}}

結果輸出:

第1輪開始
第1輪,第1次比較:
2?3?4?5?6?
第1輪,第2次比較:
2?3?4?5?6?
第1輪,第3次比較:
2?3?4?5?6?
第1輪,第4次比較:
2?3?4?5?6?
結果:
2?3?4?5?6?
最終結果
2?3?4?5?6?

總結

好了,今天的分享就這些,關于冒泡排序,你學會了嘛?如果學會了,看懂了,請留下你的點贊,收藏,分享,關注。

有任何問題可以公作號:新質程序猿,可以找到我。

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

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

相關文章

Renesas R7FA8D1BH (Cortex?-M85) 控制DS18B20

目錄 概述 1 軟硬件 1.1 軟硬件環境信息 1.2 開發板信息 1.3 調試器信息 2 FSP和KEIL配置 2.1 硬件接口電路 2.2 FSB配置DS18B20的IO 2.3 生成Keil工程文件 3 DS18B20驅動代碼 3.1 DS18B20介紹 3.2 DS18B20驅動實現 3.2.1 IO狀態定義 3.2.2 讀IO狀態函數 3.2.3…

OpenCV:python圖像旋轉,cv2.getRotationMatrix2D 和 cv2.warpAffine 函數

前言 僅供個人學習用&#xff0c;如果對各位朋友有參考價值&#xff0c;給個贊或者收藏吧 ^_^ 一. cv2.getRotationMatrix2D(center, angle, scale) 1.1 參數說明 parameters center&#xff1a;旋轉中心坐標&#xff0c;是一個元組參數(col, row) angle&#xff1a;旋轉角度…

Go-知識測試-模糊測試

Go-知識測試-模糊測試 1. 定義2. 例子3. 數據結構4. tesing.F.Add5. 模糊測試的執行6. testing.InternalFuzzTarget7. testing.runFuzzing8. testing.fRunner9. FuzzXyz10. RunFuzzWorker11. CoordinateFuzzing12. 總結 建議先看&#xff1a;https://blog.csdn.net/a1879272183…

一文入門【NestJs】Providers

Nest學習系列 ??一文入門【NestJS】 ??一文入門【NestJs】Controllers 控制器 &#x1f6a9; 前言 在NestJS的世界里&#xff0c;理解“Providers”是構建健壯、可維護的后端服務的關鍵。NestJS&#xff0c;作為Node.js的一個現代框架&#xff0c;采用了Angular的一些核…

Redis的安裝配置及IDEA中使用

目錄 一、安裝redis&#xff0c;配置redis.conf 1.安裝gcc 2.將redis的壓縮包放到指定位置解壓 [如下面放在 /opt 目錄下] 3.編譯安裝 4.配置redis.conf文件 5.開機自啟 二、解決虛擬機本地可以連接redis但是主機不能連接redis 1.虛擬機網絡適配器網絡連接設置為橋接模式…

VSCode上通過C++實現單例模式

單例模式實際上就是為了確保一個類最多只有一個實例&#xff0c;并且在程序的任何地方都可以訪問這個實例&#xff0c;也就是提供一個全局訪問點&#xff0c;單例對象不需要手動釋放&#xff0c;交給系統來釋放就可以了&#xff0c;單例模式的設計初衷就是為了在整個應用程序的…

vue 下拉菜單樹形結構——vue-treeselect的組件使用

參考&#xff1a; https://www.cnblogs.com/syjtiramisu/p/17672866.htmlhttps://www.cnblogs.com/syjtiramisu/p/17672866.html vue-treeselect的使用 - 簡書下載依賴 使用https://www.jianshu.com/p/459550e1477d 實際項目使用&#xff1a;

uni-app iOS上架相關App store App store connect 云打包有次數限制

相冊權限 uni-app云打包免費有次數 切換一個賬號繼續

使用SOAP與TrinityCore交互(待定)

原文&#xff1a;SOAP with TrinityCore | TrinityCore MMo Project Wiki 如何使用SOAP與TC交互 SOAP代表簡單對象訪問協議&#xff0c;是一種類似于REST的基于標準的web服務訪問協議的舊形式。只要必要的配置到位&#xff0c;您就可以利用SOAP向TrinityCore服務器發送命令。 …

Open3D 計算點云配準的精度和重疊度

目錄 一、概述 1.1計算配準精度 1.2計算點云重疊度 二、代碼實現 2.1關鍵函數 2.2完整代碼 三、實現效果 3.1原始點云 3.2計算結果 一、概述 在點云配準中,精度和重疊度是兩個重要的評價指標。精度通常用均方根誤差(RMSE)來衡量,而重疊度則表示兩個點云在…

centos環境啟動/重啟java服務腳本優化

centos環境啟動/重啟java服務腳本優化 引部分命令說明根據端口查詢服務進程殺死進程函數腳本接收參數 腳本注意重啟文檔位置異常 引 在離線環境部署的多個java應用組成的系統&#xff0c;測試階段需要較為頻繁的發布&#xff0c;因資源限制&#xff0c;沒有弄devops或CICD那套…

華為手機聯系人不見了怎么恢復?3個解決方案

華為手機聯系人列表就像是我們精心編織的社交網絡之網。然而&#xff0c;有時&#xff0c;這張網可能會因為各種原因而意外破損&#xff0c;聯系人信息消失得無影無蹤&#xff0c;讓我們陷入“人脈孤島”的困境。華為手機聯系人不見了怎么恢復&#xff1f;別擔心&#xff0c;我…

構建高質量數據集與智能數據工程平臺:播客AI Odyssey深度對話實錄

對話整數智能聯創和前IDEA研究員&#xff1a;構建高質量數據集與智能數據工程平臺 - AI Odyssey | 小宇宙 - 聽播客&#xff0c;上小宇宙 人工智能技術的日益深遠發展&#xff0c;對人工智能的性能提升與技術迭代提出了新的要求。在大模型訓練中&#xff0c;已有的研究和實踐表…

【操作系統】進程管理——用信號量機制解決問題,以生產者-消費者問題為例(個人筆記)

學習日期&#xff1a;2024.7.10 內容摘要&#xff1a;利用信號量機制解決幾個經典問題模型 目錄 引言 問題模型 生產者-消費者問題&#xff08;經典&#xff09; 多生產者-多消費者問題 吸煙者問題 讀者寫者問題&#xff08;難點&#xff09; 哲學家進餐問題&#xff0…

解決POST請求中文亂碼問題

解決POST請求中文亂碼問題 1、亂碼原因2、解決方法3、具體步驟 &#x1f496;The Begin&#x1f496;點點關注&#xff0c;收藏不迷路&#x1f496; 在Web開發中&#xff0c;處理POST請求時經常遇到中文亂碼問題&#xff0c;這主要是由于服務器在接收到POST請求的數據后&#x…

物聯網時代的等保測評:保障萬物互聯的安全

隨著物聯網&#xff08;IoT&#xff09;技術的飛速發展&#xff0c;我們的生活正逐漸進入一個萬物互聯的新時代。從智能家居到智慧城市&#xff0c;從無人駕駛到農業物聯網&#xff0c;IoT技術正在滲透到我們生活的方方面面。然而&#xff0c;隨著IoT設備數量的激增&#xff0c…

BUG解決:postman可以請求成功,但Python requests請求報403

目錄 問題背景 問題定位 問題解決 問題背景 使用Python的requests庫對接物聯數據的接口之前一直正常運行&#xff0c;昨天突然請求不通了&#xff0c;通過進一步驗證發現凡是使用代碼調用接口就不通&#xff0c;而使用postman就能調通&#xff0c;請求參數啥的都沒變。 接口…

SSL 證書錯誤:如何修復以及錯誤發生的原因

SSL證書可以提升網站的可信度。然而&#xff0c;如果您的SSL證書出現錯誤&#xff0c;您可能會得到一個“不安全”的標簽&#xff0c;這可能會導致訪問者失去對您網站的信任并轉向競爭對手。 本文將介紹SSL證書錯誤的原因及其對用戶的潛在影響。隨后&#xff0c;我們將提供詳細…

MybatisPlus 核心功能

MybatisPlus 核心功能 文章目錄 MybatisPlus 核心功能1. 條件構造器1.1 QueryWrapper1.2 LambdaQueryWrapper&#xff08;推薦&#xff09;1.3 UpdateWrapper1.4 LambdaUpdateWrapper 2. 自定義SQL3. Service接口 1. 條件構造器 當涉及到查詢或修改語句時&#xff0c;MybatisP…

界面組件Kendo UI for React 2024 Q2亮點 - 生成式AI集成、設計系統增強

隨著最新的2024年第二季度發布&#xff0c;Kendo UI for React為應用程序開發設定了標準&#xff0c;包括生成式AI集成、增強的設計系統功能和可訪問的數據可視化。新的2024年第二季度版本為應用程序界面提供了人工智能(AI)提示&#xff0c;從設計到代碼的生產力增強、可訪問性…