基礎算法02——冒泡排序(Bubble Sort)

冒泡排序(Bubble Sort)

  1. 冒泡排序:是一種簡單的排序算法,其基本思想是通過重復遍歷要排序的列表,比較相鄰的元素,并在必要時(即前面的數比后面的數大的時候)交換它們的位置,從而將較大的元素逐漸“冒泡”到列表的末尾。這個過程會重復進行(第一次把最大的元素放在列表的末尾,第二次把第二大的元素放在列表的倒數第二的位置,以此類推,只需執行(數組的長度-1次)這個過程即可),直到整個列表被排序。
    • 冒泡排序主要有兩個for循環組成
      • 外層for循環主要用于控制數組循環遍歷的次數
        • 數組的長度決定要遍歷的次數
      • 內層for循環主要用于元素位置的交換(把較大的元素往后移動)

冒泡排序初代代碼:減少比較次數

  • 優化點:每經過一輪冒泡,內層循環就可以減少一次
public class BubbleSort {public static void main(String[] args) {int[] arr ={24,69,80,57,13};System.out.println("排序前的數組:");printArray(arr);bubbleSort(arr);System.out.println("排序后的數組:");printArray(arr);}/*** 冒泡排序算法* @param arr:數組*/public static void bubbleSort(int[] arr) {int n = arr.length; // 數組長度// 外層循環是控制數組循環遍歷的次數:默認要循環【數組的長度-1】遍,每遍歷一次子循環的比較次數就減少一次(因為每次子循環會把最大的一個元素放在數組的最后)for (int i = 0; i < n - 1; i++) {// 內層循環控制每一次循環的比較和元素的交換(一輪冒泡)for (int j = 0; j < n - 1 - i; j++) {  // n-1-i表示要比較的元素的個數if (arr[j] > arr[j + 1]) { // 如果前一個元素大于后一個元素,則交換int temp = arr[j];arr[j] = arr[j + 1];arr[j + 1] = temp;swapped = true; // 當數組元素發生交換說明數組當前不是有序的}}}}// 打印數組public static void printArray(int[] arr) {for (int num : arr) {System.out.print(num + " ");}System.out.println();}}

案例分析

  1. 以int[] arr= {24,69,80,57,13};舉例
    • 外層for循環第1輪:把最大的數放在最后的位置
      • 前一個數和后一個數比較,如果前者大就交換位置(內層for循環)
        • 第1次比較[24,69,80,57,13] 第1個和第2個比
        • 第2次比較[24,69,80,57,13] 第2個和第3個比
        • 第3次比較[24,69,57,80,13] 第3個和第4個比(80比57大,所以80和57交換位置
        • 第4次比較[24,69,57,13,80] 第4個和第5個比(80比13大,所以80和13交換位置
    • 外層for循環第2輪:把第二大的數放在倒數第二個位置
      • 前一個數和后一個數比較,如果前者大就交換位置(內層for循環)
        • 第1次比較[24,69,57,13,80] 第1個和第2個比
        • 第2次比較[24,57,69,13,80] 第2個和第3個比
        • 第3次比較[24,57,13,69,80] 第3個和第4個比
    • 外層for循環第3輪:把第三大的數放在倒數第三個位置
      • 前一個數和后一個數比較,如果前者大就交換位置(內層for循環)
        • 第1次比較[24,57,13,69,80] 第1個和第2個比
        • 第2次比較[24,13,57,69,80] 第2個和第3個比
    • 外層for循環第4輪:把第四大的數放在倒數第四個位置
      • 前一個數和后一個數比較,如果前者大就交換位置(內層for循環)
        • 第1次比較[13,24,57,69,80] 第1個和第2個比
  • 總結
      1. 一共有5個元素(數組的長度為n,n=5)
      1. 一共進行了4輪排序(需要進行n-1輪排序)
      1. 每一輪排序可以確定一個數的位置,比如第一輪排序確定最大的數…
      1. 當進行比較時,如果前面的數大于后面的數,就交換
      1. 每輪的比較次數在減少4->3->2->1

冒泡排序改進代碼:通過swapped變量減少冒泡次數

  • 優化點:如果某一輪冒泡沒有發生交換,則表示所有數據有序,可以結束外層循環
public class BubbleSort {public static void main(String[] args) {int[] arr ={24,69,80,57,13};System.out.println("排序前的數組:");printArray(arr);bubbleSort(arr);System.out.println("排序后的數組:");printArray(arr);}/*** 冒泡排序算法* @param arr:數組*/public static void bubbleSort(int[] arr) {int n = arr.length; // 數組長度boolean swapped;// 外層循環是控制數組循環遍歷的次數:默認要循環【數組的長度-1】遍,每遍歷一次子循環的比較次數就減少一次(因為每次子循環會把最大的一個元素放在數組的最后)for (int i = 0; i < n - 1; i++) {swapped = false;  // 判斷數組是否有序,false表示有序(默認)// 內層循環控制每一次循環的比較和元素的交換(一輪冒泡)for (int j = 0; j < n - 1 - i; j++) {  // n-1-i表示要比較的元素的個數if (arr[j] > arr[j + 1]) { // 如果前一個元素大于后一個元素,則交換int temp = arr[j];arr[j] = arr[j + 1];arr[j + 1] = temp;swapped = true; // 當數組元素發生交換說明數組當前不是有序的}}// 如果某一趟沒有發生交換,說明數組已經有序,提前退出if (!swapped) {break;}}}// 打印數組public static void printArray(int[] arr) {for (int num : arr) {System.out.print(num + " ");}System.out.println();}}

冒泡排序最終實現

  • 優化點:用一個死循環作為外層循環,每次通過記錄最后一次交換索引位置進行判斷,如果在索引為0的位置,則可以結束循環。
public class BubbleSort {public static void main(String[] args) {int[] arr ={24,69,80,57,13};System.out.println("排序前的數組:");printArray(arr);bubbleSort(arr);System.out.println("排序后的數組:");printArray(arr);}/*** 冒泡排序算法* @param arr:數組*/public static void bubbleSort(int[] arr) {int n = a.length - 1;while (true) {int last = 0; // 表示最后一次交換索引位置for (int i = 0; i < n; i++) {System.out.println("比較次數" + i);if (a[i] > a[i + 1]) {int temp = arr[j];arr[j] = arr[j + 1];arr[j + 1] = temp;last = i;}}n = last;System.out.println("第輪冒泡"+ Arrays.toString(a));if (n == 0) { // 表示最后一次交換索引位置break;}}}// 打印數組public static void printArray(int[] arr) {for (int num : arr) {System.out.print(num + " ");}System.out.println();}}
  • 一直冒泡,每輪冒泡時,最后一次交換的索引可以作為下一輪冒泡的比較次數,如果這個值為零,表示整個數組有序,直接退出外層循環即可。

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

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

相關文章

RestTemplate遠程調用接口方式

1.Post(body空參) 也就是說需要給一個空的json 代碼: String getDeviceUrl this.MOVABLE_URL "detected-data/getMachineLists"; // 遠程調用 RestTemplate restTemplate new RestTemplate(); restTemplate.getMessageConverters().set(1,new StringHttpMessageC…

ar頭顯和眼鏡圖像特效處理

使用一個線程從攝像頭或者其他設備循環讀取圖像數據寫入鏈表&#xff0c;另一個線程從鏈表循環讀取數據并做相應的特效處理&#xff0c;由于寫入的速度比讀取的快&#xff0c;最終必然會因為寫入過快導致線程讀寫一幀而引發沖突和數據幀正常數據幀被覆蓋。最好使用共享內存&…

mysql--socket報錯

錯誤原因分析 MySQL 服務未運行&#xff08;最常見原因&#xff09; 錯誤中的 (2) 表示 “No such file or directory”&#xff0c;即 /tmp/mysql.sock 不存在這通常意味著 MySQL 服務器根本沒有啟動 socket 文件路徑不匹配 客戶端嘗試連接 /tmp/mysql.sock但 MySQL 服務器可…

labview加載matlab數據時報錯提示:對象引用句柄無效。

1. labview報錯提示 labview加載mat數據時報錯提示&#xff1a;對象引用句柄無效。返回該引用句柄的節點可能遇到錯誤&#xff0c;并沒有返回有效的引用句柄。該引用句柄所指的存儲可能在執行調用之前已關閉。報錯提示如下&#xff1a; 這是由于labview缺少matlab MathWorks導…

面試計算機操作系統解析(一中)

判斷 1. 一般來說&#xff0c;先進先出頁面置換算法比最近最少使用頁面置換算法有較少的缺頁率。&#xff08;?&#xff09; 正確答案&#xff1a;錯誤解釋&#xff1a;FIFO&#xff08;先進先出&#xff09;頁面置換算法可能導致“Belady異常”&#xff0c;即頁面數增加反而…

如何防御TCP洪泛攻擊

TCP洪泛攻擊&#xff08;TCP Flood Attack&#xff09;是一種常見的分布式拒絕服務&#xff08;DDoS&#xff09;攻擊手段&#xff0c;以下是其原理、攻擊方式和危害的詳細介紹&#xff1a; 定義與原理 TCP洪泛攻擊利用了TCP協議的三次握手過程。在正常的TCP連接建立過程中&a…

20250330 Pyflink with Paimon

1. 數據湖 2. 本地安裝Pyflink和Paimon 必須安裝Python 3.11 Pip install python -m pip install apache-flink1.20.1 需要手動加入這兩個jar 測試代碼&#xff1a; import argparse import logging import sys import timefrom pyflink.common import Row from pyflink.tab…

-PHP 應用SQL 盲注布爾回顯延時判斷報錯處理增刪改查方式

#PHP-MYSQL-SQL 操作 - 增刪改查 1 、功能&#xff1a;數據查詢(對數據感興趣&#xff09; 查詢&#xff1a; SELECT * FROM news where id$id 2 、功能&#xff1a;新增用戶&#xff0c;添加新聞等&#xff08;對操作的結果感興趣&#xff09; 增加&#xff1a; INSERT INT…

【學習記錄】大模型微調之使用 LLaMA-Factory 微調 Qwen系列大模型,可以用自己的數據訓練

一、LoRA微調的基本原理 1、基本概念 LoRA&#xff08;Low-Rank Adaptation&#xff09;是一種用于大模型微調的技術&#xff0c;通過引入低秩矩陣來減少微調時的參數量。在預訓練的模型中&#xff0c;LoRA通過添加兩個小矩陣B和A來近似原始的大矩陣ΔW&#xff0c;從而減少需…

Vue 使用 xlsx 插件導出 excel 文件

安裝與引入 安裝 npm install xlsx npm install file-saver # 或者 yarn add xlsx yarn add file-saver 引入 import * as XLSX from xlsx; import FileSaver from file-saver 基本功能 讀取 Excel 文件 // 讀取文件內容 const workbook XLSX.readFile(path/to/file.xl…

vulntarget_a 訓練筆記

win 7 權限 利用任意文件上傳 getshell POST /module/ueditor/php/action_upload.php?actionuploadfile HTTP/1.1 User-Agent: Mozilla/5.0 (compatible; Baiduspider/2.0; http://www.baidu.com/search/spider.html) Accept: */* Accept-Language: zh-CN,zh;q0.9 Connectio…

無人機螺旋槳平衡標準

螺旋槳平衡是確保無人機(UAV)平穩運行、可靠性和使用壽命的關鍵過程。螺旋槳的不平衡會導致振動、噪音&#xff0c;并加速關鍵部件的磨損&#xff0c;從而對飛行性能產生負面影響。 ISO 21940-11:2016標準為旋翼平衡提供了一個廣泛引用的框架&#xff0c;定義了可接受的不平衡…

既生瑜何生亮?Nginx RTMP 模塊與 SRS RTMP服務器技術對比

在實時視頻流的場景中&#xff0c;RTMP 協議作為一種傳統且高效的流媒體傳輸協議&#xff0c;廣泛應用于各類直播和點播系統。兩款流行的開源 RTMP 服務器分別是基于 Nginx 的 Nginx RTMP 模塊 和 SRS&#xff08;Simple Real-Time Server&#xff09;。這兩者都在流媒體行業有…

MATLAB 批量移動 TIF 文件至分類文件夾

文章目錄 前言一、步驟二、代碼 前言 本代碼用于從指定的源文件夾 (sourceFolder) 中篩選所有 .tif 文件&#xff0c;并根據文件名的特定關鍵詞&#xff08;Daynight 和 FDI&#xff09;將其分類移動到相應的目標文件夾 (targetDaynightFolder 和 targetFDIFolder)。 一、步驟…

重溫Ubuntu 24.04 LTS

用戶調整 # 創建新用戶 sudo adduser newusername # 設置新用戶的密碼 sudo passwd newusername # 將新用戶添加到 sudo 組 sudo usermod -aG sudo newusername # 修改ssh訪問權限 sudo nano /etc/ssh/sshd_config # 將新用戶加入&#xff0c;此時root將無法訪問 AllowUsers n…

AWS Lambda 集成更新詳解:打造無縫云函數體驗

引言 AWS Lambda 作為一種無服務器計算服務,讓開發者能夠運行代碼而無需配置或管理服務器。隨著 AWS 不斷優化其服務,Lambda 的集成方式也在不斷更新和改進。本文將深入探討 Lambda 的最新集成選項,幫助您充分利用這一強大的無服務器計算平臺。 Lambda 集成類型概述 從圖…

基于Kubernetes部署Prometheus監控平臺

#作者&#xff1a;stackofumbrella 文章目錄 prometheus和k8s集群版本對照表架構Prometheus Operator簡介kube-prometheus下載地址 安裝修改鏡像地址修改Prometheus的service修改Grafana的service修改Alertmanager的service數據持久化執行安裝 Prometheus驗證Grafana驗證解決C…

Android之uCrop (裁剪) 的基本使用資料

Android 拍照、選擇圖片并裁剪 uCrop裁剪 uCrop裁剪2 uCrop裁剪3 1.權限檢查 private static final int REQUEST_CAMERA_PERMISSION 333; private void requestCameraPermission() {if (ContextCompat.checkSelfPermission(this, android.Manifest.permission.CAMERA)! …

STM32基礎教程——輸入捕獲模式測量PWM頻率

目錄 前言 技術實現 原理圖 連線圖 代碼實現 內容要點 PWM基本結構 開啟外設時鐘 配置GPIO端口 配置時基單元 初始化輸出比較單元 輸出比較通道重映射 輸入捕獲功能初始化 計算捕獲PWM的頻率 實驗結果 問題記錄 前言 IC&#xff08;Input Capture&#xff09;輸…

基于網啟PXE服務器的批量定制系統平臺(詳細版)

項目說明 該項目共分為2個子項目&#xff0c;由iventoy和定制安裝兩部分組成 該項目旨在復習鞏固系統服務部署使用、shell編程等知識&#xff0c;旨在讓學生增加知識面&#xff0c;提高項目實習經歷&#xff0c;充實簡歷 項目背景&#xff1a; 公司新購了一批服務器和臺式機…