數據結構自學Day11-- 排序算法

一、排序算法的概念

????????排序(Sorting)是指:將一組“無序”的數據,按照某種“順序規則”排列成“有序”的過程。

1、按排序順序分類:

????????升序:從小到大排列,如 1, 3, 5, 7, 9

  • 降序:從大到小排列,如 9, 7, 5, 3, 1

2、按排序方式分類:

分類方式

排序類型

簡要說明

內部排序

冒泡、插入、選擇、歸并、快速等

所有數據在內存中進行排序

外部排序

多路歸并排序

數據量過大時,需借助外部存儲

二、 常見的排序算法及其特點

排序算法

時間復雜度(平均)

空間復雜度

是否穩定

適用場景

冒泡排序

O(n2)

O(1)

穩定

小規模數據、教學演示

選擇排序

O(n2)

O(1)

不穩定

數據量小、對穩定性要求不高

插入排序

O(n2)

O(1)

穩定

基本有序數據、鏈表排序

歸并排序

O(n log n)

O(n)

穩定

大數據排序、需要穩定性

快速排序

O(n log n)

O(log n)

不穩定

實際中最常用,效率高

堆排序

O(n log n)

O(1)

不穩定

不要求穩定性的高效排序

計數排序

O(n + k)

O(k)

穩定

數據范圍小的整數排序

桶排序

O(n + k)

O(n + k)

穩定

分布均勻的數據

基數排序

O(nk)

O(n + k)

穩定

位數較小的整數/字符串

三、排序算法的應用場景

  1. 數據庫系統

    • 排序是實現?ORDER BY?的核心

    • 排序有助于數據壓縮和索引創建

  2. 搜索優化

    • 排序之后可以使用二分查找,大幅提高搜索效率

    數據分析和可視化

    • 排序能幫助找出最大/最小值、前 K 大數等

    • 排序數據更容易圖表化展示

  3. 去重和統計

    ? ? ? ? ? 排序后相同數據聚集在一起,方便統計頻率或去重

  4. 工程開發

    ? ? ? ? ? 排序是實現自動推薦、頁面排名、調度優化等系統的基礎

四、常用排序算法的實現

? ? ? ? 1、冒泡排序🫧

? ? ? ? 不斷比較鄰近的元素,將大元素右移,最終排成升序序列

代碼實現:

void Swap(int* p,int* q){assert(p&&q);int tmp = *p;*p = *q;*q = tmp;return;
}void Bubble_sort(int* arr,int size){assert(arr);int end = size-1;int flag = 0;for (int i = 0;i<end;i++){for(int j = 0;j<end-i;j++){if(arr[j]>arr[j+1]){Swap(&arr[j],&arr[j+1]);flag = 1;}}if(flag == 0){break;}}return;
}//測試函數
int main(){int arr[]= {6,2,8,10,1,3,5,12,4};Bubble_sort(arr,9);for(int i = 0;i<9;i++){printf("%d ",arr[i]);}
}

冒泡排序的時間復雜度為O(N^2),空間復雜度O(1)

2、插入排序

????????將數組的每個元素與所在位置之前的元素比較,找到升序(降序)位插入即可。

代碼實現:

void Insert_Sort(int* arr,int size){assert(arr);for (int end = 1;end<size;end++){for(int j = end-1;j>=0;j--){if(arr[j+1]<arr[j]){Swap(&arr[j],&arr[j+1]);}else{break;}}}
}int main(){int arr[]= {6,2,8,10,1,3,5,12,4};// Bubble_sort(arr,9);Insert_Sort(arr,9);for(int i = 0;i<9;i++){printf("%d ",arr[i]);}
}

插入排序的時間復雜度為O(N^2),空間復雜度O(1)

3、希爾排序的基本思想

希爾排序的提出者是 Donald Shell(1959 年),它是第一個突破 O(n2)?時間復雜度的排序算法。

核心思想:
將原始數組按照某個間隔 gap 進行“分組”,每組分別進行插入排序,然后逐步減小 gap,最終 gap = 1 時再進行一次插入排序,完成排序。
希爾排序的步驟說明(以升序為例)
  1. 選擇一個初始間隔 gap,通常是數組長度的一半,如?gap = n/2

  2. 將數組劃分為?gap?個子序列(組內元素間隔為 gap

  3. 對每個子序列進行插入排序

  4. 縮小 gap:gap = gap / 2

  5. 重復步驟 2~4,直到?gap = 1

思維導圖

代碼實現:

void Shell_Sort(int* arr,int size){assert(arr);int gap = size;while(gap > 1){gap = gap/3+1;for (int end = gap;end<size;end++){int j = end-gap;int tmp = arr[end];while (j>=0 && arr[j]>tmp){arr[j+gap] = arr[j];j -= gap;}arr[j+gap] = tmp;}  }
}

希爾排序的時間復雜度:最壞情況視 gap 序列而定,常見為 O(n^(1.3 ~ 2)),比 O(n2) 快很多

希爾排序的特點

特性

描述

時間復雜度

最壞情況視 gap 序列而定,常見為 O(n^(1.3 ~ 2)),比 O(n2) 快很多

空間復雜度

O(1)(原地排序)

穩定性

不穩定排序(可能打亂相同元素順序)

應用場景

中等規模、內存受限的排序任務

希爾排序與插入排序的對比

項目

插入排序

希爾排序

排序速度

慢(O(n2))

快(改進版插排)

數據交換次數

排序思想

比較相鄰元素

比較“間隔 gap”的元素

應對無序數據

效率低

效率更高

好了本期的排序算法內容分享就到這里結束了,謝謝大家的點贊收藏

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

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

相關文章

電子元器件—三極管(一篇文章搞懂電路中的三極管)(筆記)(面試考試必備知識點)

三極管的定義及工作原理1. 定義三極管&#xff08;Transistor&#xff09;是一種具有三層半導體材料&#xff08;P-N-P 或 N-P-N&#xff09;構成的半導體器件&#xff0c;用于信號放大、開關控制和信號調制等應用。三極管有三個引腳&#xff1a;發射極&#xff08;Emitter&…

數據結構之克魯斯卡爾算法

前言&#xff1a;和Prim算法一樣&#xff0c;Kruskal 算法也是用來生成最小生成樹的&#xff0c;這篇文章來學習一下Kruskal算法的實現 一、實現流程 初始化的時候&#xff0c;將所有的邊用一個數組存儲&#xff0c;并且按權值從小到大進行排序&#xff0c;每次選一個權值最小的…

MongoDB 查詢時區問題

MongoDB默認時區是UTC&#xff0c;比北京時區晚八小時&#xff0c;北京時間UTC8h。 // 北京時間的 2024-10-01 08:00:00 // (>) 大于 - $gt // (<) 小于 - $lt // (>) 大于等于 - $gte // (< ) 小于等于 - $lte// Z代表UTC時區1、{"gmtCreate":{"$…

Windows VS2019 編譯 Apache Thrift 0.15.0

隨著微服務架構的普及,高效的跨語言遠程過程調用(RPC) 成為了構建分布式系統的重要基礎。Apache Thrift 是 Facebook 開源的一個輕量級、高性能的 RPC 框架,它允許開發者通過一個通用的接口定義語言(IDL)來定義服務接口和數據結構,并自動生成多種語言的客戶端和服務端代…

搭建種草商城框架指南

一、引言在當今電商市場&#xff0c;種草商城以其獨特的社交化購物模式受到越來越多用戶的喜愛。搭建一個功能完善、體驗良好的種草商城框架&#xff0c;需要綜合考慮前端界面、后端服務、數據庫設計等多個方面。本文將為你詳細介紹搭建種草商城框架的關鍵要點和技術選型。二、…

docker--掛載

設置容器的掛載 需要注意 掛載行為會覆蓋容器目標目錄的原有內容(未驗證)。 查看容器的掛載情況 在容器外部查看: docker inspect <容器名或容器ID> | grep -A n "Mounts" -A n 的含義 -A 是 --after-context 的縮寫,表示顯示匹配行及其后 n 行。 "Mo…

以Streamable HTTP方式訪問mcp server的過程

一、mcp server 部署 使用fastmcp框架 部署 mcp server&#xff0c; 以下是源代碼 # 引入 fastmcp 依賴包 from fastmcp import FastMCP# 新建fastmcp實例&#xff0c; 名字叫做 weather mcp FastMCP("weather")mcp.tool(name"weather", tags{"weath…

二次元 IP 虛擬數字人宣傳:漫畫角色動態直播與衍生周邊預售聯動

當漫畫角色從靜態畫稿中走出&#xff0c;以動態直播的形式與粉絲實時互動&#xff0c;再順勢開啟衍生周邊預售 —— 虛擬數字人技術正重塑二次元 IP 的宣傳邏輯。這種 “動態直播 周邊預售” 的聯動模式&#xff0c;不僅打破了次元壁&#xff0c;更讓 IP 熱度高效轉化為商業價…

如何在服務器上獲取Linux目錄大小

目前我在管理一臺hostease的服務器時遇到服務器磁盤空間不足的情況。隨著在系統中添加更多文件&#xff0c;這些系統文件目錄也變得越來越大。過大的目錄也消耗了系統資源&#xff0c;導致系統運行緩慢。后來我通過下列的方法對服務器上的磁盤空間使用進行了逐一檢查。在這篇綜…

來伊份養饞記社區零售 4.0 上海首店落滬:重構 “家門口” 的生活服務生態

7 月 19 日&#xff0c;來伊份與養饞記戰略合作的首個 “社區零售 4.0” 門店在上海松江泗涇鎮泗寶路正式開業。這不僅是雙方自今年 1 月達成戰略合作后的實質性落地&#xff0c;更是 3 月 “社區生活新生態” 構想的首次規模化實踐&#xff0c;標志著零食行業巨頭與社區零售新…

從C++開始的編程生活(3)——引用類型、內聯inline和nullptr

前言 本系列文章承接C語言的學習&#xff0c;需要有C語言的基礎才能學會哦~ 第3篇主要講的是有關于C的引用類型、內聯inline和nullptr。 C才起步&#xff0c;都很簡單呢&#xff01; 目錄 前言 引用類型 基本語法 特性 應用 const引用 基本語法 引用與指針的關系 內聯…

makefile-- 其他函數

fuctionsjoin?$(join <list1>,<list2>)連接函數把list2 中單詞對應的添加到list1 的后面若list1 的單詞個數> list2 &#xff0c;多出的list1 保持不變若list2 的單詞個數> list21&#xff0c;多出的list2 添加到list1 后面foreach?$(foreach <var>…

【unity實戰】使用unity的Navigation+LineRenderer實現一個3D人物尋路提前指示預測移動軌跡的效果,并可以適配不同的地形

文章目錄 前言 實戰 1、實現要點 1.1 NavMesh.CalculatePath方法計算兩個點之間的導航路徑 1.2 尋找投射的地面點 2、代碼實現如下 3、烘培地面導航網格 4、添加導航玩家代理,并掛載前面的腳本 5、創建Line Renderer,并放在角色下面作為子物體 6、運行游戲查看效果 專欄推薦 …

寶塔申請證書錯誤,提示 module ‘OpenSSL.crypto‘ has no attribute ‘sign‘

遇到"module OpenSSL.crypto has no attribute sign"錯誤時&#xff0c;通常是由于pyOpenSSL版本兼容性問題導致的?。以下是解決方案&#xff1a;通過SSH連接到服務器&#xff0c;執行以下命令安裝指定版本的pyOpenSSL&#xff1a;btpip install pyOpenSSL24.2.1-U然…

【ffmpeg源碼學習】詳解pkg-config的作用

文章目錄 前言 一、什么是pkg-config? 二、為什么需要 pkg-config? 三、pkg-config 的工作原理 3.1 .pc 文件 3.2 查詢流程 3.3 查找路徑 四、pkg-config 在 FFmpeg 中的作用 五、pkg-config 的常用命令 六、在項目中的實際用法 6.1 makefile示例: 6.2 cmake示例: 6.3 gcc命…

PHPStorm攜手ThinkPHP8:開啟高效開發之旅

目錄一、前期準備1.1 開發環境搭建1.2 配置 Xdebug二、PHPStorm 集成 ThinkPHP82.1 導入 ThinkPHP8 項目2.2 配置 PHP 解釋器2.3 配置服務器三、ThinkPHP8 項目開發基礎3.1 項目結構剖析3.2 控制器與方法創建3.3 視圖渲染與數據傳遞四、數據庫操作與模型定義4.1 數據庫配置4.2 …

HTTP性能優化實戰技術詳解(2025)

HTTP性能優化實戰技術詳解本文基于提供的文章大綱&#xff0c;對HTTP性能優化進行擴展說明。文章結構清晰&#xff0c;從理解瓶頸到具體優化策略&#xff0c;再到監控與高級技巧&#xff0c;逐步展開。每個部分包括背景介紹、核心原理、實施步驟、示例或工具推薦&#xff0c;確…

探索文件系統:軟硬鏈接的奧秘

目錄 1.文件系統 1.1 磁盤物理存儲結構 1.2 磁盤邏輯存儲結構 1.3 inode編號 2. 軟硬鏈接 2.1 軟鏈接 2.2 硬鏈接 2.3 目錄文件的軟硬鏈接 1.文件系統 在一臺電腦中&#xff0c;大部分文件都不是被打開的&#xff0c;這些文件都在磁盤中進行保存。已經打開的文件需要管…

3x3矩陣教程

3x3矩陣教程 1. 簡介 三維矩陣是線性代數中的重要概念&#xff0c;用于表示三維空間中的線性變換。本教程將介紹如何使用C實現三維矩陣的基本運算和變換。 2. 代碼實現 2.1 頭文件 (matrix3x3.h) #ifndef MATRIX3X3_H #define MATRIX3X3_H#include <array> #include <…

深度學習前置知識

文章目錄介紹數據操作張量張量的定義1. **張量的維度&#xff08;Rank&#xff09;**2. **張量的形狀&#xff08;Shape&#xff09;**簡單的數據預處理&#xff08;插值線性代數微積分概率論1. 基本概念(1) 隨機試驗與事件(2) 概率公理&#xff08;Kolmogorov公理&#xff09;…