常用的排序算法及對比

1. 選擇排序(Selection Sort)

算法思想與理論推導

  • 基本思想:
    每次從待排序數組中選擇最小(或最大)的元素,將它與當前序列的起始位置交換,逐步將整個數組排序。

  • 推導過程:
    設數組長度為 n,第一次遍歷需要掃描 n 個元素找到最小值,第二次掃描 (n-1) 個元素……直到最后一個元素。
    總的比較次數約為:

    (n-1) + (n-2) + \cdots + 1 = \frac{n(n-1)}{2} = O(n^2)

算法步驟

  1. 對于下標 i 從 0 到 n-2

    • 在區間 [i, n-1] 內找到最小元素的下標 min_index

    • min_indexi,則交換元素 arr[i] 與 arr[min_index]。

時間復雜度分析

  • 最壞情況: O(n2)

  • 平均情況: O(n2)

  • 空間復雜度: O(1)(原地排序)

  • 穩定性: 不穩定(因為交換可能改變相同元素的相對順序)


2. 插入排序(Insertion Sort)

算法思想與理論推導

  • 基本思想:
    將數組分為已排序和未排序兩部分,每次取未排序部分的第一個元素,在已排序部分中找到合適的位置插入,使已排序部分始終保持有序。

  • 推導過程:
    對于每個元素,最壞情況下需要和前面所有元素比較并移動位置。第 i 個元素可能需要 i 次比較和移動,總的操作次數約為:

    1 + 2 + \cdots + (n-1) = \frac{n(n-1)}{2} = O(n^2)

    當數組已經接近有序時,比較次數大大減少,時間復雜度可以達到 O(n)。

算法步驟

  1. 從數組第二個元素開始(下標 1):

    • 記當前元素為 key,從已排序部分從后向前比較,若遇到比 key 大的元素則后移。

    • 插入 key 到合適的位置。

時間復雜度分析

  • 最壞情況: O(n2)(例如數組逆序排列)

  • 平均情況: O(n2)

  • 最好情況: O(n)(例如數組已經有序)

  • 空間復雜度: O(1)

  • 穩定性: 穩定


3. 冒泡排序(Bubble Sort)

算法思想與理論推導

  • 基本思想:
    通過多次遍歷數組,每次比較相鄰元素,如果順序錯誤則交換,將較大(或較小)的元素逐步“冒泡”到數組的一端。

  • 推導過程:
    每次遍歷最多做 n-1 次比較,整個排序需要進行 n-1 次遍歷,所以總的比較次數約為:

    (n-1) \times (n-1) = O(n^2)

算法步驟

  1. 重復遍歷整個數組,

    • 對于每一對相鄰元素,如果前者大于后者則交換。

    • 每遍歷完一次后,最大的元素“浮”到數組末尾。

  2. 如果一整趟遍歷沒有發生交換,則排序結束。

時間復雜度分析

  • 最壞情況: O(n2)

  • 平均情況: O(n2)

  • 最好情況: 若增加標志位檢測無交換情況,則最好情況為 O(n)(已經有序)

  • 空間復雜度: O(1)

  • 穩定性: 穩定


4. 歸并排序(Merge Sort)

算法思想與理論推導

  • 基本思想:
    利用分治法,將數組遞歸地分解為兩個子序列,分別排序后再將兩個有序子序列合并成一個整體有序序列。

  • 推導過程:
    設 T(n) 為排序 n 個元素的時間復雜度,則:

    T(n) = 2T\left(\frac{n}{2}\right) + O(n)

    根據主定理,解得 T(n) = O(n log n)。

算法步驟

  1. 分解階段:

    • 將數組分為兩半。

    • 遞歸地對兩半分別進行歸并排序。

  2. 合并階段:

    • 合并兩個有序子數組。

時間復雜度分析

  • 最壞情況: O(n log n)

  • 平均情況: O(n log n)

  • 最好情況: O(n log n)

  • 空間復雜度: O(n)(需要額外的輔助空間用于合并)

  • 穩定性: 穩定


5. 自然合并排序(Natural Merge Sort)

算法思想與理論推導

  • 基本思想:
    利用數據中已存在的自然有序(“天然有序”的子序列或“段”),先將序列分割成若干個自然有序的段,再逐步將這些段兩兩歸并。

  • 推導過程:
    如果輸入數據已經部分有序,則自然有序的段較長,合并次數減少,最佳情況時間復雜度可接近 O(n)。
    最壞情況仍然為歸并排序的情況,即當數據完全無序時,各自然段長度為 1,總共需要 O(log n) 次歸并,每次歸并時間 O(n),故為 O(n log n)。

算法步驟

  1. 識別自然段:

    • 掃描數組,識別連續遞增(或遞減)的一段作為一個“自然段”。

  2. 歸并階段:

    • 將相鄰的自然段兩兩合并,形成新的較長的自然段。

    • 重復歸并過程直到整個數組有序。

時間復雜度分析

  • 最壞情況: O(n log n)

  • 平均情況: O(n log n)

  • 最好情況: 如果數組整體有序,識別出一個自然段,時間復雜度 O(n)

  • 空間復雜度: O(n)(歸并時需要輔助數組)

  • 穩定性: 穩定


6. 快速排序(Quick Sort)

算法思想與理論推導

  • 基本思想:
    利用分治策略選擇一個“基準”(這里取第一個元素),將數組分成兩部分:左邊所有元素均小于基準,右邊所有元素均大于基準,然后對這兩部分遞歸進行排序。

  • 推導過程:
    設 T(n) 為排序 n 個元素的時間復雜度,則:

    T(n) = T(k) + T(n-k-1) + O(n)

    其中 k 表示劃分后左側子數組的大小。

    • 平均情況: 當每次劃分較為均勻(大致各半),有 T(n) = 2T(n/2) + O(n),解得 T(n) = O(n log n)

    • 最壞情況: 當劃分極不均勻(如數組已排序,且始終選擇最小或最大元素作為基準),有 T(n) = T(n-1) + O(n),解得 T(n) = O(n2)。

算法步驟

  1. 選擇基準:

    • 選擇第一個元素作為基準。

  2. 分區操作:

    • 從數組兩端向中間掃描,將比基準小的元素移到左邊,比基準大的元素移到右邊。

  3. 遞歸排序:

    • 對左右兩個子數組分別進行快速排序。

時間復雜度分析

  • 最壞情況: O(n2)(例如每次劃分極不均勻)

  • 平均情況: O(n log n)

  • 最好情況: O(n log n)

  • 空間復雜度: O(log n)(遞歸調用棧空間,平均情況下)

  • 穩定性: 不穩定


算法對比

算法時間復雜度(最壞/平均/最好)空間復雜度穩定性特點與適用場景
選擇排序O(n2) / O(n2) / O(n2)O(1)不穩定實現簡單,但比較次數固定,不適合大規模數據排序
插入排序O(n2) / O(n2) / O(n)O(1)穩定對部分有序數據效果好,適用于小規模數據或在線排序
冒泡排序O(n2) / O(n2) / O(n)(優化版)O(1)穩定實現簡單,但效率低,更多用于教學演示
歸并排序O(n log n) / O(n log n) / O(n log n)O(n)穩定時間復雜度穩定,適用于大規模數據,但需要額外空間
自然合并排序O(n log n) / O(n log n) / O(n)O(n)穩定能利用已有有序序列提升效率,適合部分有序數據
快速排序O(n2) / O(n log n) / O(n log n)O(log n)(平均)不穩定平均性能優異,原地排序,適合大規模數據,但最壞情況需注意

總結

  • 簡單排序(選擇、插入、冒泡):
    這些算法實現簡單,但時間復雜度均為 O(n2)(在最壞或平均情況下),適合數據量較小的情況。插入排序在數據部分有序時表現較好,而冒泡排序常用作教學示例。

  • 分治排序(歸并、快速、自然合并):
    歸并排序和快速排序均有 O(n log n) 的平均時間復雜度,其中歸并排序穩定但需要額外空間,而快速排序在原地排序方面有優勢。自然合并排序則利用了數據中已有的有序性,在實際應用中對于部分有序數據可獲得較好性能。

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

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

相關文章

Linux基礎入門:從零開始掌握Linux命令行操作

🙋大家好!我是毛毛張! 🌈個人首頁: 神馬都會億點點的毛毛張 🎈有沒有覺得電影里的黑客🐒酷斃了?他們只用鍵盤?就能搞定一切。今天,毛毛張要帶你們體驗這種快感😀&…

OpenAI發布的《Addendum to GPT-4o System Card: Native image generation》文件的詳盡筆記

Native_Image_Generation_System_Card 文件基本信息 文件名稱:《Addendum to GPT-4o System Card: Native image generation》發布機構:OpenAI發布日期:2025年3月25日主要內容:介紹GPT-4o模型中新增的原生圖像生成功能&#xff…

5.02 WPF的 Combox、ListBox,slider、ProgressBar使用

1. 關于Combox\ListBox使用: 1.1 內容綁定有兩種方法, 優先使用方法1,因為列表變化的時候,Combox會自動顯示新的內容。而方法2并不會實時更新。 方法1:使用DataContext this.comboBox1.DisplayMemberPath "na…

《孟婆湯的SHA-256加密》

點擊下面圖片帶您領略全新的嵌入式學習路線 🔥爆款熱榜 88萬閱讀 1.6萬收藏 文章目錄 **第一章:黃泉路上的數據風暴****第二章:堿基對的非對稱加密****第三章:RAFT協議暴動事件****第四章:靈魂分叉與硬重放****終章&…

SpringBoot事務管理(四)

記錄幾條SpringBoot事務管理中踩過的坑及解決辦法: 1. 自調用問題 問題描述 在同一個類中,一個非事務方法調用另一個有 Transactional 注解的事務方法,事務不會生效。因為 Spring 的事務管理是基于 AOP 代理實現的,自調用時不會…

HTTP 1.1長連接問題

在長連接問題上,HTTP 1.1與HTTP 1.0還是有所區別的。 下面一起來看看: HTTP 1.1 支持長連接(PersistentConnection)和請求的流水線(Pipelining)處理,在一個 TCP 連接上可以傳送多個 HTTP 請求…

鴻蒙應用元服務開發-Account Kit概述

Account Kit(華為賬號服務)提供簡單、快速、安全的登錄功能,讓用戶快捷地使用華為賬號登錄元服務。用戶授權后,Account Kit可提供頭像、手機號碼等信息,幫助元服務更了解用戶。Account Kit提供的SampleCode示例工程體現…

IP綜合實驗

1.配置eth-trunk進行綁定 [LSW1]interface Eth-Trunk 0 [LSW1-Eth-Trunk0]q [LSW1]interface g0/0/2 [LSW1-GigabitEthernet0/0/2]eth-trunk 0 [LSW1-GigabitEthernet0/0/2]int g0/0/3 [LSW1-GigabitEthernet0/0/3]eth-trunk 0 [LSW1-GigabitEthernet0/0/3]display et…

SAP 學習筆記 - 系統移行業務 - MALSY(由Excel 移行到SAP 的收費工具)

以前有關移行,也寫過一些文章,比如 SAP 學習筆記 - 系統移行業務 - Migration cockpit工具 - 移行Material(品目)-CSDN博客 SAP 學習筆記 - 系統移行業務 - Migration cockpit工具2 - Lot導入_sap cockpit-CSDN博客 SAP學習筆記…

二叉樹搜索樹與雙向鏈表

一:題目 二:思路 把二叉搜索樹的值升序的打印出來,中序打印即可,但是此題不僅僅是有序的打印出二叉搜索樹的值,而是要將其的結構也改變了,也就是說要改變節點間的指向,讓其成為一個雙向鏈表 我…

31天Python入門——第17天:初識面向對象

你好,我是安然無虞。 文章目錄 面向對象編程1. 什么是面向對象2. 類(class)3. 類的實例關于self 4. 對象的初始化5. __str__6. 類之間的關系繼承關系組合關系 7. 補充練習 面向對象編程 1. 什么是面向對象 面向對象編程是一種編程思想,它將現實世界的概念和關系映…

Spring Boot中常用內嵌數據庫(H2、HSQLDB、Derby)的對比,包含配置示例和關鍵差異總結

以下是Spring Boot中常用內嵌數據庫的對比,包含配置示例和關鍵差異總結: 一、主流內嵌數據庫對比 1. H2 數據庫 特點: 支持內存模式(速度快)和文件模式(數據持久化)。支持SQL方言&#xff08…

Apache Hive和Snowflake的`CREATE VIEW`語法和功能特性整理的對比表

寫一個Apache Hive中CREATE VIEW語句轉換為對應Snowflake中CREATE VIEW語句的程序,現在需要一個根據功能的相似性對應的Apache HiveQL和Snowflake SQL的CREATE VIEW語句的表。 以下是基于Apache Hive的CREATE VIEW語法規則構造的所有可能合法語句實例及其功能說明&…

個人博客網站從搭建到上線教程

步驟1:設計個人網站 設計個人博客網站的風格樣式,可以在各個模板網站上多瀏覽瀏覽,以便有更多設計網站風格樣式的經驗。 設計個人博客網站的內容,你希望你的網站包含哪些內容如你的個人基本信息介紹、你想分享的項目、你想分享的技術文檔等等。 步驟2:選擇開發技術棧 因…

PHP回調后門

1.系統命令執行 直接windows或liunx命令 各個程序 相應的函數 來實現 system exec shell_Exec passshru 2.執行代碼 eval assert php代碼 系統 <?php eval($_POST) <?php assert($_POST) 簡單的測試 回調后門函數call_user_func(1,2) 1是回調的函數 2是回調…

Raspberry 樹莓派 CM4模塊的底板設計注意事項

1&#xff0c; 樹莓派CM4底板設計 樹莓派CM4模塊集成了CPU&#xff0c; 存儲器&#xff0c;以太網&#xff0c; 無線模塊&#xff0c;電源等等&#xff0c; 大大降低了硬件設計的要求。對我們使用樹莓派提供了很好的便利性。 本人近期因為項目的需要設計了一款CM4的底板&#x…

Java后端開發(十八)-- 使用JAXB,將JavaBean轉換XML文本

下面是測試時的運行環境: 1.jdk8 2.Maven,可能需要需要的依賴,如下: <dependency><groupId>javax.xml.bind</groupId><artifactId>jaxb-api</artifactId><version>2.3.1</version></dependency><dependency><gr…

【一起來學kubernetes】30、k8s的java sdk怎么用

Kubernetes Java SDK 是開發者在 Java 應用中與 Kubernetes 集群交互的核心工具&#xff0c;支持資源管理、服務發現、配置操作等功能。 一、主流 Java SDK 對比與選擇 官方 client-java 庫 特點&#xff1a;由 Kubernetes 社區維護&#xff0c;API 與 Kubernetes 原生對象嚴格…

PHP開發者2025生存指南

PHP&#xff0c;這個曾經被戲稱為“世界上最好的語言”的腳本語言&#xff0c;依舊在網絡世界占據著重要的地位。然而&#xff0c;技術發展日新月異&#xff0c;面向2025年&#xff0c;PHP開發者要想保持競爭力甚至實現職業生涯的飛躍&#xff0c;需要不斷學習和提升自身技能。…

MySQL與Redis數據一致性保障方案詳解

前言 在現代分布式系統中&#xff0c;MySQL和Redis的結合使用非常普遍。MySQL作為關系型數據庫負責持久化存儲&#xff0c;而Redis則作為高性能緩存層提升系統的響應速度。然而&#xff0c;在這種架構下&#xff0c;如何保證MySQL與Redis之間的數據一致性是一個重要的挑戰。本…