數據結構——排序算法(簡單篇:冒泡排序、選擇排序、插入排序)

1?? 冒泡排序(Bubble Sort)

基本思想

  • 重復地比較相鄰的兩個元素,如果順序錯誤就交換它們。
  • 一趟冒泡結束后,最大(或最小)的元素會“浮”到末尾。
  • 下一趟時可以少比較一次,因為最后的元素已經排好。

過程示例(升序)

假設數組:[5, 3, 8, 4, 2]

第一趟比較:

  • (5, 3) → 交換 → [3, 5, 8, 4, 2]
  • (5, 8) → 不換 → [3, 5, 8, 4, 2]
  • (8, 4) → 交換 → [3, 5, 4, 8, 2]
  • (8, 2) → 交換 → [3, 5, 4, 2, 8] ? 最大的 8 已到末尾

第二趟比較(不用管最后的 8):

  • (3, 5) → 不換
  • (5, 4) → 交換 → [3, 4, 5, 2, 8]
  • (5, 2) → 交換 → [3, 4, 2, 5, 8] ? 次大值 5 已到倒數第二位

… 直到全部有序。

時間復雜度

  • 最壞情況:O(n2)(逆序)
  • 最好情況:O(n)(已排序,可加優化)
  • 空間復雜度:O(1)

Python 代碼

def bubble_sort(arr):n = len(arr)for i in range(n):swapped = False  # 優化:如果一趟沒交換,說明已排序for j in range(0, n - i - 1):if arr[j] > arr[j + 1]:arr[j], arr[j + 1] = arr[j + 1], arr[j]swapped = Trueif not swapped:breakreturn arr# 示例
data = [5, 3, 8, 4, 2]
print(bubble_sort(data))

2?? 選擇排序(Selection Sort)

基本思想

  • 每一趟從未排序部分選擇最小(或最大)元素,放到已排序部分的末尾。
  • 每趟交換次數固定為 1 次,但比較次數較多。

工作過程示例(升序)

初始數組:[5, 3, 8, 4, 2]

第一趟:

  • [5, 3, 8, 4, 2] 中找到最小值 2
  • 交換 2 和第一個元素 → [2, 3, 8, 4, 5]

第二趟:

  • [3, 8, 4, 5] 中最小值 3(不動) → [2, 3, 8, 4, 5]

第三趟:

  • [8, 4, 5] 中最小值 4
  • 交換 → [2, 3, 4, 8, 5]

第四趟:

  • [8, 5] 中最小值 5
  • 交換 → [2, 3, 4, 5, 8]

時間復雜度

  • 最壞情況:O(n2)
  • 最好情況:O(n2)(比較次數固定)
  • 空間復雜度:O(1)

Python 代碼

def selection_sort(arr):n = len(arr)for i in range(n):min_idx = ifor j in range(i + 1, n):if arr[j] < arr[min_idx]:min_idx = jarr[i], arr[min_idx] = arr[min_idx], arr[i]return arr# 示例
data = [5, 3, 8, 4, 2]
print(selection_sort(data))

3?? 插入排序(Insertion Sort)

基本思想

  • 將數組分為已排序區未排序區
  • 每次從未排序區取出一個元素,插入到已排序區的合適位置。

工作過程示例(升序)

初始數組:[5, 3, 8, 4, 2]

第一步(i=1):

  • 已排序區 [5]
  • 取 3,插入到 5 前面 → [3, 5, 8, 4, 2]

第二步(i=2):

  • 已排序區 [3, 5]
  • 取 8,放到末尾 → [3, 5, 8, 4, 2]

第三步(i=3):

  • 已排序區 [3, 5, 8]
  • 取 4,插到 5 前面 → [3, 4, 5, 8, 2]

第四步(i=4):

  • 已排序區 [3, 4, 5, 8]
  • 取 2,插到最前面 → [2, 3, 4, 5, 8]

時間復雜度

  • 最壞情況:O(n2)
  • 最好情況:O(n)(已排序)
  • 空間復雜度:O(1)
  • 小規模數據基本有序數據非常快

Python 代碼

def insertion_sort(arr):for i in range(1, len(arr)):key = arr[i]  # 當前要插入的元素j = i - 1while j >= 0 and arr[j] > key:arr[j + 1] = arr[j]  # 后移j -= 1arr[j + 1] = keyreturn arr# 示例
data = [5, 3, 8, 4, 2]
print(insertion_sort(data))

🔍 對比總結

算法最好時間最壞時間穩定性空間復雜度適用場景
冒泡排序O(n)O(n2)穩定O(1)數據量小,且大致有序
選擇排序O(n2)O(n2)不穩定O(1)數據量小,對交換次數敏感
插入排序O(n)O(n2)穩定O(1)數據基本有序,小規模排序

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

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

相關文章

配置 Docker 鏡像加速,解決 docker pull 拉取鏡像失敗、docker search 查詢鏡像失敗等問題

一、概述 記錄時間 [2025-08-16] 在 Docker 學習中&#xff0c;可能會遇到諸如 docker 遠程倉庫無法訪問、docker pull 拉取鏡像失敗、docker search 查詢鏡像失敗等問題。 這是由于國內網絡對 docker 遠程倉庫的訪問受到限制。 那么在國內如何獲取 docker 鏡像呢&#xff1f…

【Python】Python 面向對象編程詳解?

Python 面向對象編程詳解? 文章目錄Python 面向對象編程詳解?前言一、面向對象的基本概念?1.1 類&#xff08;Class&#xff09;?1.2 對象&#xff08;Object&#xff09;?1.3 屬性&#xff08;Attribute&#xff09;?1.4 方法&#xff08;Method&#xff09;?二、類的定…

Redis 緩存和 Redis 分布式鎖

目錄 Redis 緩存 (Caching) 目的 核心邏輯 存儲形式總結 典型場景 Redis 分布式鎖 (Distributed Lock) 目的 核心作用 核心邏輯 典型場景 核心區別總結 Redis 緩存 (Caching) 在Redis中&#xff0c;數據是以鍵值對的形式存儲的&#xff0c;其中鍵總是字符串類型&…

[ java 基礎 ] 了解編程語言的第一步

目錄 一. IDE (1). 使用IDE的原因: (2). 創建和使用: (3). 常用快捷方式與設置 (4). 注釋 (5). 關鍵字 (6). 標識符 (7). 變量 (8). 數據類型 1) 整數類型 2) 浮點類型 3) 布爾類型(boolean) 4) 字符類型(char) 5) 字符串 6) 基本數據類之間的轉換 (9). 運算符…

JavaScript 閉包與遞歸深度解析:從理論到實戰

本文將系統梳理 JavaScript 中閉包與遞歸的核心概念、實戰應用及面試要點,涵蓋課堂知識點、作業實現、面試題解析等內容,幫助你全面掌握這兩大重要概念。 一、閉包:函數與變量的綁定藝術 1.1 閉包的定義與核心特性 閉包是 JavaScript 中一種特殊的語言現象,其核心定義可…

牛 CDR3 單抗:抗病毒領域的 “納米級精準導彈”

一、病毒防御的天然克星病毒感染的核心難題在于其表面的 “糖衣炮彈”—— 以 HIV 為例&#xff0c;其 Env 蛋白表面密集的糖鏈形成物理屏障&#xff0c;傳統抗體難以穿透。而牛 CDR3 單抗的超長 CDR H3 結構&#xff08;50-60 個氨基酸&#xff09;如同 “納米探針”&#xff…

鴻蒙應用開發和Vue網頁開發中生命周期的區別

因為下節課就可以寫講解兩者生命周期代碼的實戰了&#xff0c;寫介紹一下理論方面的區別&#xff1a;鴻蒙應用開發&#xff08;ArkUI范式&#xff09;與Vue網頁開發在生命周期管理上的核心區別&#xff0c;這直接反映了原生OS應用與Web應用在架構哲學和運行環境上的根本差異??…

基于SpringBoot+Vue的輕手工創意分享平臺(WebSocket即時通訊、協同過濾算法、Echarts圖形化分析)

&#x1f388;系統亮點&#xff1a;WebSocket即時通訊、協同過濾算法、Echarts圖形化分析&#xff1b;一.系統開發工具與環境搭建1.系統設計開發工具后端使用Java編程語言的Spring boot框架 項目架構&#xff1a;B/S架構 運行環境&#xff1a;win10/win11、jdk17前端&#xff1…

Java應屆生求職八股(5)---并發編程篇

線程基礎線程與進程的區別進程是程序的一次執行過程。它資源分配的單位。線程是程序執行的單位。并行和并發的區別單核CPU下&#xff0c;線程串行。&#xff08;并發&#xff1a;多線程輪流使用一個或多個CPU&#xff09;多核CPU下&#xff0c;每個核都可調度線程。&#xff08…

WSL 配置文件 wsl.conf 設置

WSL .wslconfig 小技巧 要在 WSL&#xff08;Windows Subsystem for Linux&#xff09;中增加內存&#xff0c;你需要編輯 WSL 配置文件 wsl.conf 或者直接調整虛擬機的資源限制。 文章目錄WSL .wslconfig 小技巧以下是步驟&#xff1a; 找到或創建 .wslconfig 文件&#xff1…

9.從零開始寫LINUX內核——設置中斷描述符表

Linux 0.12 內核中斷描述符表&#xff08;IDT&#xff09;完整實現代碼以下是基于 setup 程序擴展的完整代碼&#xff0c;包含中斷描述符表&#xff08;IDT&#xff09;的定義、初始化及中斷處理程序&#xff0c;可直接用于實驗驗證&#xff1a;asm/* setup.s —— 4 扇區&…

手機實時提取SIM卡打電話的信令聲音-當前現狀與思考

手機實時提取SIM卡打電話的信令聲音-當前現狀與思考 --純手機-無外置配件的方案規劃 上一篇&#xff1a;手機實時提取SIM卡打電話的信令聲音-新的篇章(篇外小結與思考) 下一篇&#xff1a;手機實時提取SIM卡打電話的信令聲音-整體解決方案規劃 一、前言 我們在2024年09月的…

【車聯網kafka】常用參數及其命令總結(第八篇)

目錄 1、kafka參數 1.1 、消費者消息批次發送 1.2 、消息大小的配置(環環相扣的消息大小&#xff0c;調整時需要一起調整) 1.3 、消息重試發送冪等 1.4、消息提交 1.5、分區分配策略&#xff08;自己看的設置&#xff09; 1.6、文件存儲 2、kafka命令 2.1 常用命令一覽…

基于Spring Boot 4s店車輛管理系統 租車管理系統 停車位管理系統 智慧車輛管理系統

&#x1f525;作者&#xff1a;it畢設實戰小研&#x1f525; &#x1f496;簡介&#xff1a;java、微信小程序、安卓&#xff1b;定制開發&#xff0c;遠程調試 代碼講解&#xff0c;文檔指導&#xff0c;ppt制作&#x1f496; 精彩專欄推薦訂閱&#xff1a;在下方專欄&#x1…

17.4 合并購物車

分析 用戶登錄后&#xff0c;將Cookie中的購物車商品合并到redis數據庫中。如果此時redis中已經有相同id的商品&#xff0c;則使用Cookie中的數據覆蓋redis中的數據。 合并功能需要在用戶登錄后實現&#xff0c;但登錄視圖中應避免過多與登錄邏輯無關的邏輯&#xff0c;所以考慮…

RK3588消費級8K VR一體機 是否有坑?

??芯片平臺????定位場景????核心優勢????消費級功能性短板??全志H8/RK3288入門級VR低成本、基礎性能穩定算力弱&#xff08;4*A55&#xff09;、無NPU、顯示分辨率僅1080P高通XR1中端VR/AR均衡性能&#xff08;Adreno 615 GPU&#xff09;僅WiFi5、續航≤4小時…

基于Spring Boot校園二手交易平臺系統設計與實現 二手交易系統 交易平臺小程序

&#x1f525;作者&#xff1a;it畢設實戰小研&#x1f525; &#x1f496;簡介&#xff1a;java、微信小程序、安卓&#xff1b;定制開發&#xff0c;遠程調試 代碼講解&#xff0c;文檔指導&#xff0c;ppt制作&#x1f496; 精彩專欄推薦訂閱&#xff1a;在下方專欄&#x1…

Nginx 服務器常用操作

一. Nginx 常用配置 1. Nginx 總配置文件 nginx 安裝目錄下的 nginx.conf 文件: # 指定 Nginx worker 進程運行的系統用戶 user nginx; # 自動根據 CPU 核心數啟動相應數量的 worker 進程&#xff0c;充分利用多核。 worker_processes auto; # 自動將 worker 進程綁定到特定 …

PHP官方及第三方下載地址全指南(2025最新版)

PHP官方及第三方下載地址全指南&#xff08;2025最新版&#xff09; 本文整理了PHP官方及主流第三方下載渠道&#xff0c;包含PHP 5.5至8.4各版本的直接下載鏈接&#xff0c;助您快速獲取安全可靠的PHP環境。 一、PHP官方下載渠道 1.1 全球主站下載 網址&#xff1a;https://…

深度剖析Redisson分布式鎖項目實戰

今天在練手項目中也是遇到了許多新的技術&#xff0c;其中我認為最深刻的還是Redisson分布式鎖&#xff0c;這里我就結合一下我項目中用到Redisson分布式鎖的代碼來講述一下Redisson分布式鎖&#xff0c;希望可以幫助大家更深刻地理解這項技術。在之前的文章中我已經講過Rediss…