排序算法之基礎排序:冒泡,選擇,插入排序詳解

排序算法之基礎排序:冒泡、選擇、插入排序詳解

  • 前言
  • 一、冒泡排序(Bubble Sort)
    • 1.1 算法原理
    • 1.2 代碼實現(Python)
    • 1.3 性能分析
  • 二、選擇排序(Selection Sort)
    • 2.1 算法原理
    • 2.2 代碼實現(Java)
    • 2.3 性能分析
  • 三、插入排序(Insertion Sort)
    • 3.1 算法原理
    • 3.2 代碼實現(C++)
    • 3.3 性能分析
  • 四、三種基礎排序算法的對比與應用場景
    • 算法對比
    • 應用場景
  • 總結

前言

排序算法是數據處理的基礎且重要的組成部分,冒泡排序、選擇排序和插入排序作為基礎排序算法,雖然在效率上不及一些高級排序算法,但它們原理簡單、易于理解,是學習排序算法的入門之選,也是理解更復雜排序算法的基礎。本文我將詳細介紹這三種基礎排序算法的原理、實現代碼、性能分析以及實際應用場景。

一、冒泡排序(Bubble Sort)

1.1 算法原理

冒泡排序的基本思想是重復地走訪過要排序的數列,一次比較兩個相鄰的元素,如果它們的順序錯誤就把它們交換過來。走訪數列的工作是重復地進行直到沒有再需要交換,也就是說該數列已經排序完成。這個過程就像水中的氣泡,較小(或較大)的元素會逐漸 “浮” 到數列的頂端,因此得名冒泡排序。

具體過程如下:

比較相鄰的元素。如果第一個比第二個大(升序排序),就交換它們兩個。

對每一對相鄰元素做同樣的工作,從開始第一對到結尾的最后一對。這步做完后,最后的元素會是最大的數。

針對所有的元素重復以上的步驟,除了最后一個。

持續每次對越來越少的元素重復上面的步驟,直到沒有任何一對數字需要比較。
冒泡

1.2 代碼實現(Python)

def bubble_sort(arr):n = len(arr)for i in range(n):for j in range(0, n - i - 1):if arr[j] > arr[j + 1]:arr[j], arr[j + 1] = arr[j + 1], arr[j]return arr

在上述代碼中,外層循環控制排序的輪數,一共需要n輪(n為數組長度)。內層循環用于每一輪中相鄰元素的比較和交換,隨著外層循環的進行,每一輪比較的次數逐漸減少,因為每一輪結束后,最大的元素已經 “沉” 到了數組末尾。

1.3 性能分析

時間復雜度

最好情況:當數組已經是有序狀態時,冒泡排序只需要進行一次遍歷,比較n - 1次,不需要交換元素,時間復雜度為 O ( n ) O(n) O(n)

最壞情況:當數組是逆序狀態時,需要進行 n ( n ? 1 ) / 2 n(n - 1) / 2 n(n?1)/2次比較和交換操作,時間復雜度為 O ( n 2 ) O(n^2) O(n2)

平均情況:時間復雜度同樣為 O ( n 2 ) O(n^2) O(n2)

空間復雜度:冒泡排序只需要使用常數級別的額外空間來進行元素交換,空間復雜度為 O ( 1 ) O(1) O(1)

穩定性:冒泡排序是一種穩定的排序算法,因為在比較和交換元素時,相同元素的相對順序不會改變。

二、選擇排序(Selection Sort)

2.1 算法原理

選擇排序的工作原理是每一次從待排序的數據元素中選出最小(或最大)的一個元素,存放在序列的起始位置,直到全部待排序的數據元素排完。

具體步驟如下:

在未排序序列中找到最小(大)元素,存放到排序序列的起始位置。

再從剩余未排序元素中繼續尋找最小(大)元素,然后放到已排序序列的末尾。

重復第二步,直到所有元素均排序完畢。
選擇排序

2.2 代碼實現(Java)

public class SelectionSort {public static int[] selectionSort(int[] arr) {int n = arr.length;for (int i = 0; i < n - 1; i++) {int minIndex = i;for (int j = i + 1; j < n; j++) {if (arr[j] < arr[minIndex]) {minIndex = j;}}int temp = arr[minIndex];arr[minIndex] = arr[i];arr[i] = temp;}return arr;}public static void main(String[] args) {int[] arr = {64, 25, 12, 22, 11};int[] sortedArr = selectionSort(arr);for (int num : sortedArr) {System.out.print(num + " ");}}
}

上述 Java 代碼中,外層循環控制排序的輪數,一共需要n - 1輪(n為數組長度)。內層循環用于在每一輪中找到未排序部分的最小元素的索引,然后將其與當前輪起始位置的元素交換。

2.3 性能分析

時間復雜度

最好情況:即使數組已經是有序的,選擇排序也需要進行 n ( n ? 1 ) / 2 n(n - 1) / 2 n(n?1)/2次比較,時間復雜度為 O ( n 2 ) O(n^2) O(n2)

最壞情況:同樣需要進行 n ( n ? 1 ) / 2 n(n - 1) / 2 n(n?1)/2次比較和交換操作,時間復雜度為 O ( n 2 ) O(n^2) O(n2)

平均情況:時間復雜度為 O ( n 2 ) O(n^2) O(n2)

空間復雜度:選擇排序只需要使用常數級別的額外空間來進行元素交換,空間復雜度為 O ( 1 ) O(1) O(1)

穩定性:選擇排序是不穩定的排序算法,因為在選擇最小元素并交換位置時,可能會改變相同元素的相對順序。例如,數組[5, 5, 3],在排序過程中兩個5的相對順序可能會發生變化。

三、插入排序(Insertion Sort)

3.1 算法原理

插入排序的基本思想是將一個數據插入到已經排好序的有序數據中,從而得到一個新的、個數加一的有序數據。其操作過程就像玩撲克牌時整理手中牌的過程,每次從 “牌堆” 中摸一張牌,插入到手中已整理好的牌的合適位置。

具體過程如下:

從第一個元素開始,該元素可以認為已經被排序。

取出下一個元素,在已經排序的元素序列中從后向前掃描。

如果該元素(已排序)大于新元素,將該元素移到下一位置。

重復步驟 3,直到找到已排序的元素小于或者等于新元素的位置。

將新元素插入到該位置后。

重復步驟 2~5,直到所有元素均排序完畢。
插入排序

3.2 代碼實現(C++)

#include <iostream>
#include <vector>
using namespace std;vector<int> insertionSort(vector<int> arr) {int n = arr.size();for (int i = 1; i < n; ++i) {int key = arr[i];int j = i - 1;while (j >= 0 && arr[j] > key) {arr[j + 1] = arr[j];j = j - 1;}arr[j + 1] = key;}return arr;
}

在 C++ 代碼中,外層循環從數組的第二個元素開始(因為第一個元素默認已排序)。內層循環用于在已排序部分中找到合適的插入位置,將當前元素插入到正確的位置,使得已排序部分始終保持有序。

3.3 性能分析

時間復雜度

最好情況:當數組已經是有序狀態時,每插入一個元素只需要比較一次,不需要移動元素,時間復雜度為 O ( n ) O(n) O(n)

最壞情況:當數組是逆序狀態時,插入每個元素都需要比較和移動i次(i為當前元素的索引),時間復雜度為 O ( n 2 ) O(n^2) O(n2)

平均情況:時間復雜度為 O ( n 2 ) O(n^2) O(n2)

空間復雜度:插入排序只需要使用常數級別的額外空間來保存當前要插入的元素,空間復雜度為 O ( 1 ) O(1) O(1)

穩定性:插入排序是穩定的排序算法,因為在插入元素時,相同元素的相對順序不會改變。

四、三種基礎排序算法的對比與應用場景

算法對比

排序算法時間復雜度(最好)時間復雜度(最壞)時間復雜度(平均)空間復雜度穩定性
冒泡排序 O ( n ) O(n) O(n) O ( n 2 ) O(n^2) O(n2) O ( n 2 ) O(n^2) O(n2) O ( 1 ) O(1) O(1)穩定
選擇排序 O ( n 2 ) O(n^2) O(n2) O ( n 2 ) O(n^2) O(n2) O ( n 2 ) O(n^2) O(n2) O ( 1 ) O(1) O(1)不穩定
插入排序 O ( n ) O(n) O(n) O ( n 2 ) O(n^2) O(n2) O ( n 2 ) O(n^2) O(n2) O ( 1 ) O(1) O(1)穩定

應用場景

冒泡排序:由于其簡單易懂,常用于教學場景幫助初學者理解排序算法的基本概念。在數據規模較小且對時間要求不高的情況下,也可以使用。

選擇排序:適用于對穩定性要求不高,且數據規模較小的排序場景。比如在一些簡單的游戲內數據排序或者資源管理系統中,當數據量不大時可以使用。

插入排序:對于部分有序的數組或者數據量較小的數組,插入排序表現較好。例如,在數據庫的某些索引維護操作中,如果數據更新后仍保持部分有序,插入排序可以高效地對新數據進行插入和排序。

總結

冒泡排序、選擇排序和插入排序作為基礎排序算法,雖然在時間復雜度上都為 O ( n 2 ) O(n^2) O(n2),在處理大規模數據時效率較低,但它們的原理簡單,實現容易,是學習排序算法的重要基石。通過理解這三種算法,我們可以更好地掌握排序算法的基本思想,為學習更復雜高效的排序算法(快速排序、歸并排序、堆排序等)打下堅實的基礎。在下期博客中,我將深入探討快速排序與歸并排序這兩種高效排序算法,詳細解析它們的實現機制、性能特點以及在不同場景下的應用優勢,幫助大家進一步拓寬對排序算法的認知邊界。

That’s all, thanks for reading!
創作不易,點贊鼓勵;
知識無價,收藏備用;
持續精彩,關注不錯過!

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

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

相關文章

第十節第一部分:常見的API:Math、System、Runtime

Math類介紹及常用方法&#xff08;了解知道即可&#xff09; System類介紹及常用方法&#xff08;了解知道即可&#xff09; Runtime類介紹及常用方法&#xff08;了解知道即可&#xff09; 代碼&#xff1a; 代碼一&#xff1a;Math類 package com.itheima.d14_math;public …

智能體間協作的“巴別塔困境“如何破解?解讀Agent通信4大協議:MCP/ACP/A2A/ANP

AI 智能體的興起觸發了AI應用協作的新領域。這些智能體不再局限于被動的聊天機器人或獨立的系統&#xff0c;它們現在被設計用于推理、計劃和協作ーー跨任務、跨域甚至跨組織。但隨著這一愿景成為現實&#xff0c;一個挑戰很快浮出水面&#xff1a; 智能體如何以一種安全、可伸…

項目進度延誤,如何按時交付?

項目進度延誤可以通過加強計劃管理、優化資源分配、強化團隊溝通、設置關鍵里程碑和風險管理機制等方式來實現按時交付。加強計劃管理、優化資源分配、強化團隊溝通、設置關鍵里程碑、風險管理機制。其中&#xff0c;加強計劃管理尤為關鍵&#xff0c;因為明確而詳細的計劃能提…

詳解ip地址、子網掩碼、網關、廣播地址

1. IP 地址 定義&#xff1a;IP 地址是網絡設備在網絡中的唯一標識&#xff0c;用于標識設備的網絡位置&#xff0c;類似于現實中的門牌號。它分為 IPv4&#xff08;如 192.168.1.5&#xff09;和 IPv6&#xff08;如 240e:305:3685:8100:a00:27ff:fefb:56b8&#xff09;。 示…

為 Windows 和 Ubuntu 中設定代理服務器的詳細方法

有時下載大模型總是下載不出來&#xff0c;要配置代理才行 一、Windows代理設置 ① 系統全局代理設置 打開【設置】→【網絡和Internet】→【代理】。 在【手動設置代理】下&#xff0c;打開開關&#xff0c;輸入&#xff1a; 地址&#xff1a;10.10.10.215 端口&#xff1a;…

鴻蒙OSUniApp 實現的表單驗證與提交功能#三方框架 #Uniapp

UniApp 實現的表單驗證與提交功能 前言 在移動端應用開發中&#xff0c;表單是用戶與應用交互的重要媒介。一個好的表單不僅布局合理、使用方便&#xff0c;還應該具備完善的驗證與提交功能&#xff0c;以確保用戶輸入的數據準確無誤。本文將分享如何在 UniApp 中實現表單驗證…

前端的面試筆記——HTMLJavaScript篇(二)前端頁面性能檢測

前端頁面性能檢測和判定是優化用戶體驗的核心環節&#xff0c;需要結合實驗室數據&#xff08;Lab Data&#xff09;、現場數據&#xff08;Field Data&#xff09;和行業標準綜合評估。以下是主流方法、工具及判定標準的詳細解析&#xff1a; 一、性能檢測的核心維度與指標 …

再來1章linux系列-19 防火墻 iptables 雙網卡主機的內核 firewall-cmd firewalld的高級規則

學習目標&#xff1a; 實驗實驗需求實驗配置內容和分析 &#xff08;每一個設備的每一步操作&#xff09;實驗結果驗證其他 學習內容&#xff1a; 實驗實驗需求實驗配置內容和分析 &#xff08;每一個設備的每一步操作&#xff09;實驗結果驗證其他 1.實驗 2.實驗需求 圖…

LLM-Based Agent綜述及其框架學習(五)

文章目錄 摘要Abstract1. 引言2. 文本輸出3. 工具的使用3.1 理解工具3.2 學會使用工具3.3 制作自給自足的工具3.4 工具可以擴展LLM-Based Agent的行動空間3.5 總結 4. 具身動作5. 學習智能體框架5.1 CrewAI學習進度5.2 LangGraph學習進度5.3 MCP學習進度 參考總結 摘要 本文圍繞…

游戲引擎學習第298天:改進排序鍵 - 第1部分

關于向玩家展示多個房間層所需的兩種 Z 值 我們在前一天基本完成了為渲染系統引入分層 Z 值的工作&#xff0c;但還沒有完全完成所有細節。我們開始引入圖形渲染中的分層概念&#xff0c;即在 Z 軸方向上擁有多個獨立圖層&#xff0c;每個圖層內部再使用一個單獨的 Z 值來實現…

一些C++入門基礎

關鍵字 圖引自 C 關鍵詞 - cppreference.com 命名空間 命名空間解決了C沒辦法解決的各類命名沖突問題 C的標準命名空間&#xff1a;std 命名空間中可以定義變量、函數、類型&#xff1a; namespace CS {//變量char cs408[] "DS,OS,JW,JZ";int cs 408;//函數vo…

學習筆記:黑馬程序員JavaWeb開發教程(2025.4.6)

12.4 登錄校驗-JWT令牌-介紹 JWT&#xff08;JSON Web Token&#xff09; 簡潔是指JWT是一個簡單字符串&#xff0c;自包含指的是JWT令牌&#xff0c;看似是一個隨機字符串&#xff0c;但是可以根據需要&#xff0c;自定義存儲內容 Header是JSON數據格式&#xff0c;原始JSO…

香港科技大學物理學理學(科學計算與先進材料物理與技術)碩士招生宣講會——深圳大學

香港科技大學物理學理學&#xff08;科學計算與先進材料物理與技術&#xff09;碩士招生宣講會——深圳大學專場 &#x1f559;時間&#xff1a;2025年5月23日&#xff08;星期五&#xff09;14:30 &#x1f3eb;地點&#xff1a;深圳大學滄海校區致原樓1101 &#x1f9d1…

數據庫優化技巧:MySQL 重復數據查詢與刪除(僅保留一條)的性能優化策略

目錄 一、查詢重復數據 二、刪除重復數據 方法 1&#xff1a;創建臨時表&#xff0c;操作完成后再刪除臨時表&#xff08;安全可靠&#xff0c;適合大表&#xff09; 步驟 1&#xff1a;創建臨時表存儲需刪除的 ID 步驟 2&#xff1a;根據臨時表刪除數據 方法 2&#xff1a…

分布式ID生成器:原理、對比與WorkerID實戰

一、為什么需要分布式ID&#xff1f; 在微服務架構下&#xff0c;單機自增ID無法滿足跨服務唯一性需求&#xff0c;且存在&#xff1a; ? 單點瓶頸&#xff1a;數據庫自增ID依賴單表寫入 ? 全局唯一性&#xff1a;跨服務生成可能重復 ? 擴展性差&#xff1a;分庫分表后ID規…

Golang的代碼注釋規范與實踐

# Golang的代碼注釋規范與實踐 一、注釋的重要性 代碼注釋是程序員交流的橋梁 代碼注釋是程序員之間溝通交流的重要形式&#xff0c;良好的注釋能夠幫助其他開發者更快地理解代碼的意圖和實現方式。 代碼維護離不開注釋 在項目維護過程中&#xff0c;良好的注釋能夠幫助開發者回…

Qt讀取Excel文件的技術實現與最佳實踐

目錄 一、成果展示二、核心方法及原理1. QAxObject(基于COM接口)2. 第三方庫QXlsx3. ODBC數據庫驅動三、實現步驟詳解1. QAxObject讀取Excel(需安裝Excel/WPS)2. QXlsx讀取Excel(跨平臺方案)四、技術選型與對比五、應用場景與優化建議1. 高頻數據處理2. 跨平臺工具開發3.…

機器學習第十五講:決策樹全面講解:像玩“20個問題“游戲猜身份[特殊字符]

機器學習第十五講&#xff1a;決策樹全面講解&#xff1a;像玩"20個問題"游戲猜身份&#x1f3ae; 資料取自《零基礎學機器學習》。 查看總目錄&#xff1a;學習大綱 關于DeepSeek本地部署指南可以看下我之前寫的文章&#xff1a;DeepSeek R1本地與線上滿血版部署&…

CCpro工程編程軟件

CXpro?? 是一個軟件應用套件&#xff0c;用以完成 ABB Cylon CB 系列 BACnet 控制器的設計、工程、編程、配置、測試、調試和維護。 主要優勢 CXpro?? 提供改進的導航和頁面命名&#xff0c;使開發人員能夠輕松地圍繞大型策略進行操作。它也允許立即訪問可快速更新的點和…

數據庫(二):ORM技術

什么是 ORM&#xff1f; ORM&#xff08;Object-Relational Mapping&#xff09; 是一種用于實現 對象模型&#xff08;面向對象&#xff09;與關系模型&#xff08;數據庫&#xff09;之間映射的技術&#xff0c;使程序員可以通過操作對象的方式訪問數據庫數據&#xff0c;而無…