數據結構排序算法總結(C語言實現)

以下是常見排序算法的總結及C語言實現,包含時間復雜度、空間復雜度和穩定性分析:


1. 冒泡排序 (Bubble Sort)

思想:重復比較相鄰元素,將較大元素向后移動。
時間復雜度:O(n2)(最好O(n),最壞O(n2))
空間復雜度:O(1)
穩定性:穩定

void bubbleSort(int arr[], int n) {for (int i = 0; i < n - 1; i++) {int swapped = 0;for (int j = 0; j < n - i - 1; j++) {if (arr[j] > arr[j + 1]) {// 交換相鄰元素int temp = arr[j];arr[j] = arr[j + 1];arr[j + 1] = temp;swapped = 1;}}if (!swapped) break; // 無交換說明已有序}
}

2. 選擇排序 (Selection Sort)

思想:每次選擇未排序部分的最小值,放到已排序序列末尾。
時間復雜度:O(n2)
空間復雜度:O(1)
穩定性:不穩定(交換可能破壞順序)

void selectionSort(int arr[], int n) {for (int i = 0; i < n - 1; i++) {int minIdx = i;for (int j = i + 1; j < n; j++) {if (arr[j] < arr[minIdx]) {minIdx = j;}}// 將最小值交換到當前位置int temp = arr[i];arr[i] = arr[minIdx];arr[minIdx] = temp;}
}

3. 插入排序 (Insertion Sort)

思想:將未排序元素逐個插入已排序序列的合適位置。
時間復雜度:O(n2)(最好O(n))
空間復雜度:O(1)
穩定性:穩定

void insertionSort(int arr[], int n) {for (int i = 1; i < n; i++) {int key = arr[i];int j = i - 1;// 將大于key的元素后移while (j >= 0 && arr[j] > key) {arr[j + 1] = arr[j];j--;}arr[j + 1] = key;}
}

4. 希爾排序 (Shell Sort)

思想:改進的插入排序,通過分組增量逐步減少間隔排序。
時間復雜度:O(n log n) ~ O(n2)
空間復雜度:O(1)
穩定性:不穩定

void shellSort(int arr[], int n) {for (int gap = n / 2; gap > 0; gap /= 2) {for (int i = gap; i < n; i++) {int temp = arr[i];int j;for (j = i; j >= gap && arr[j - gap] > temp; j -= gap) {arr[j] = arr[j - gap];}arr[j] = temp;}}
}

5. 歸并排序 (Merge Sort)

思想:分治法,遞歸拆分數組后合并有序子序列。
時間復雜度:O(n log n)
空間復雜度:O(n)
穩定性:穩定

// 合并兩個有序數組
void merge(int arr[], int left, int mid, int right) {int n1 = mid - left + 1;int n2 = right - mid;int L[n1], R[n2];for (int i = 0; i < n1; i++) L[i] = arr[left + i];for (int j = 0; j < n2; j++) R[j] = arr[mid + 1 + j];int i = 0, j = 0, k = left;while (i < n1 && j < n2) {if (L[i] <= R[j]) arr[k++] = L[i++];else arr[k++] = R[j++];}while (i < n1) arr[k++] = L[i++];while (j < n2) arr[k++] = R[j++];
}// 遞歸排序
void mergeSort(int arr[], int left, int right) {if (left < right) {int mid = left + (right - left) / 2;mergeSort(arr, left, mid);mergeSort(arr, mid + 1, right);merge(arr, left, mid, right);}
}

6. 快速排序 (Quick Sort)

思想:分治法,選取基準值將數組分為兩部分遞歸排序。
時間復雜度:O(n log n)(最壞O(n2))
空間復雜度:O(log n)(遞歸棧)
穩定性:不穩定

// 分區函數
int partition(int arr[], int low, int high) {int pivot = arr[high]; // 選擇最后一個元素為基準int i = low - 1;for (int j = low; j < high; j++) {if (arr[j] < pivot) {i++;// 交換元素int temp = arr[i];arr[i] = arr[j];arr[j] = temp;}}// 將基準放到正確位置int temp = arr[i + 1];arr[i + 1] = arr[high];arr[high] = temp;return i + 1;
}void quickSort(int arr[], int low, int high) {if (low < high) {int pi = partition(arr, low, high);quickSort(arr, low, pi - 1);quickSort(arr, pi + 1, high);}
}

7. 堆排序 (Heap Sort)

思想:利用最大堆性質,將堆頂元素(最大值)與末尾交換后調整堆。
時間復雜度:O(n log n)
空間復雜度:O(1)
穩定性:不穩定

void heapify(int arr[], int n, int i) {int largest = i;int left = 2 * i + 1;int right = 2 * i + 2;if (left < n && arr[left] > arr[largest]) largest = left;if (right < n && arr[right] > arr[largest]) largest = right;if (largest != i) {int temp = arr[i];arr[i] = arr[largest];arr[largest] = temp;heapify(arr, n, largest);}
}void heapSort(int arr[], int n) {// 構建最大堆for (int i = n / 2 - 1; i >= 0; i--) heapify(arr, n, i);// 逐個提取最大值for (int i = n - 1; i > 0; i--) {int temp = arr[0];arr[0] = arr[i];arr[i] = temp;heapify(arr, i, 0);}
}

算法對比表

排序算法平均時間復雜度最好情況最壞情況空間復雜度穩定性
冒泡排序O(n2)O(n)O(n2)O(1)穩定
選擇排序O(n2)O(n2)O(n2)O(1)不穩定
插入排序O(n2)O(n)O(n2)O(1)穩定
希爾排序O(n log n)O(n log2 n)O(n2)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(n2)O(log n)不穩定
堆排序O(n log n)O(n log n)O(n log n)O(1)不穩定

使用建議

  • 小規模數據:插入排序(簡單且穩定)

  • 中等規模:希爾排序(無需額外空間)

  • 大規模數據:快速排序(平均性能最優)

  • 需要穩定性:歸并排序(穩定且O(n log n))

  • 內存限制:堆排序(原地排序)

實際應用中常結合多種算法(如快速排序+插入排序)。

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

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

相關文章

嵌入式學習-PyTorch(2)-day19

很久沒有學了&#xff0c;期間打點滴打了一個多星期&#xff0c;太累了&#xff0c;再加上學了一下Python語法基礎&#xff0c;再終于開始重新學習pytorchtensorboard 的使用import torch from torch.utils.tensorboard import SummaryWriter writer SummaryWriter("logs…

Prompt Engineering 快速入門+實戰案例

資料來源&#xff1a;火山引擎-開發者社區 引言 什么是 prompt A prompt is an input to a Generative AI model, that is used to guide its output. Prompt engineering is the process of writing effective instructions for a model, such that it consistently generat…

「源力覺醒 創作者計劃」_文心開源模型(ERNIE-4.5-VL-28B-A3B-PT)使用心得

文章目錄背景操作流程開源模型選擇算力服務器平臺開通部署一個算力服務器登錄GPU算力服務器進行模型的部署FastDeploy 快速部署服務安裝paddlepaddle-gpu1. 降級沖突的庫版本安裝fastdeploy直接部署模型&#xff08;此處大約花費15分鐘時間&#xff09;放行服務端口供公網訪問最…

P10719 [GESP202406 五級] 黑白格

題目傳送門 前言&#xff1a;不是這樣例有點過分了哈&#xff1a; 這是我沒考慮到無解的情況的得分&#xff1a; 這是我考慮了的得分&#xff1a; 總而言之&#xff0c;就是一個Subtask 你沒考慮無解的情況&#xff08;除了Subtask #0&#xff09;,就會WA一大片,然后這個Subt…

AWS RDS PostgreSQL可觀測性最佳實踐

AWS RDS PostgreSQL 介紹AWS RDS PostgreSQL 是亞馬遜云服務&#xff08;AWS&#xff09;提供的托管型 PostgreSQL 數據庫服務。托管服務&#xff1a;AWS 管理數據庫的底層基礎設施&#xff0c;包括硬件、操作系統、數據庫引擎等&#xff0c;用戶無需自行維護。高性能&#xff…

C++——set,map的模擬實現

文章目錄前言紅黑樹的改變set的模擬實現基本框架迭代器插入源碼map模擬實現基礎框架迭代器插入賦值重載源碼測試代碼前言 set&#xff0c;map底層使用紅黑樹這種平衡二叉搜索樹來組織元素 &#xff0c;這使得set, map能夠提供對數時間復雜度的查找、插入和刪除操作。 下面都是基…

LabVIEW液壓機智能監控

?基于LabVIEW平臺&#xff0c;結合西門子、研華等硬件&#xff0c;構建液壓機實時監控系統。通過 OPC 通信技術實現上位機與 PLC 的數據交互&#xff0c;解決傳統監控系統數據采集滯后、存儲有限、參數調控不便等問題&#xff0c;可精準采集沖壓過程中的位置、速度、壓力等參數…

15. 什么是 xss 攻擊?怎么防護

總結 跨站腳本攻擊&#xff0c;注入惡意腳本敏感字符轉義&#xff1a;“<”,“/”前端可以抓包篡改主要后臺處理&#xff0c;轉義什么是 XSS 攻擊&#xff1f;怎么防護 概述 XSS&#xff08;Cross-Site Scripting&#xff0c;跨站腳本攻擊&#xff09;是一種常見的 Web 安全…

更換docker工作目錄

使用環境 由于默認系統盤比較小docker鏡像很容易就占滿&#xff0c;需要掛載新的磁盤修改docker的默認工作目錄 環境&#xff1a;centos7 docker默認工作目錄: /var/lib/docker/ 新的工作目錄&#xff1a;/home/docker-data【自己手動創建&#xff0c;一般掛在新加的磁盤下面】…

算法學習筆記:26.二叉搜索樹(生日限定版)——從原理到實戰,涵蓋 LeetCode 與考研 408 例題

二叉搜索樹&#xff08;Binary Search Tree&#xff0c;簡稱 BST&#xff09;是一種特殊的二叉樹&#xff0c;因其高效的查找、插入和刪除操作&#xff0c;成為計算機科學中最重要的數據結構之一。BST 的核心特性是 “左小右大”&#xff0c;這一特性使其在數據檢索、排序和索引…

共生型企業:駕馭AI自動化(事+AI)與人類增強(人+AI)的雙重前沿

目錄 引言&#xff1a;人工智能的雙重前沿 第一部分&#xff1a;自動化范式&#xff08;事AI&#xff09;——重新定義卓越運營 第一章&#xff1a;智能自動化的機制 第二章&#xff1a;自動化驅動的行業轉型 第三章&#xff1a;自動化的經濟演算 第二部分&#xff1a;協…

TypeScript的export用法

在 TypeScript 中&#xff0c;export 用于將模塊中的變量、函數、類、類型等暴露給外部使用。export 語法允許將模塊化的代碼分割并在其他文件中導入。 1. 命名導出&#xff08;Named Export&#xff09; 命名導出是 TypeScript 中最常見的一種導出方式&#xff0c;它允許你導出…

數據結構-2(鏈表)

一、思維導圖二、鏈表的反轉def reverse(self):"""思路&#xff1a;1、設置previous_node、current、next_node三個變量,目標是將current和previous_node逐步向后循環并逐步進行反轉,知道所有元素都被反轉2、但唯一的問題是&#xff1a;一旦current.next反轉為向…

ros2 標定相機

一個終端執行&#xff1a; ros2 run image_tools cam2image --ros-args -p width:640 -p height:480 -p frequency:30.0 -p device_id:-1 -r /image:/camera/image_raw另一個終端執行&#xff1a;8x6 是格子角點數量&#xff0c;0.028是格子尺寸 ros2 run camera_calibration …

IsaacLab學習記錄(二)

二、導入并訓練自己的機器人1、urdf等其他格式轉usd&#xff08;工具在./scrips/tools/&#xff09;???維度????URDF (Unified Robot Description Format)????USD (Universal Scene Description)????定位??機器人模型描述標準&#xff08;僅描述單機器人&…

基于Rust Softplus 函數實踐方法

Softplus 函數 Softplus 函數是神經網絡中常用的激活函數之一,定義為: ? Softplus函數導數 ? 是 sigmoid 函數。Softplus 處處可導,并且導數恰好是 sigmoid。 它是 ReLU 函數的平滑近似,具有連續可導的特性,適合需要梯度優化的場景。 數學特性 平滑性:導數為 Sig…

Ubuntu服務器安裝Miniconda

下載 Miniconda 安裝腳本&#xff08;如果能聯網&#xff09;wget https://repo.anaconda.com/miniconda/Miniconda3-py39_24.1.2-0-Linux-x86_64.sh -O Miniconda3.sh安裝 Miniconda 到 /opt/condabash Miniconda3.sh -b -p /opt/conda激活 conda/opt/conda/bin/conda init ba…

Java數組補充v2

一、數組基本概念1. 什么是數組數組是Java中用來存儲同類型數據的固定大小的連續內存空間的數據結構。2. 數組特點固定長度&#xff1a;一旦創建&#xff0c;長度不可改變相同類型&#xff1a;所有元素必須是同一數據類型索引訪問&#xff1a;通過下標&#xff08;從0開始&…

【PTA數據結構 | C語言版】前綴樹的3個操作

本專欄持續輸出數據結構題目集&#xff0c;歡迎訂閱。 文章目錄題目代碼題目 請編寫程序&#xff0c;利用前綴樹查找給定字符串是否在某給定字符串集合 S 中。 輸入格式&#xff1a; 輸入首先給出一個正整數 n&#xff08;≤1000&#xff09;&#xff0c;隨后 n 行&#xff0…

JAVA面試寶典 -《緩存架構:穿透 / 雪崩 / 擊穿解決方案》

&#x1f4a5;《緩存架構&#xff1a;穿透 / 雪崩 / 擊穿解決方案》 文章目錄&#x1f4a5;《緩存架構&#xff1a;穿透 / 雪崩 / 擊穿解決方案》&#x1f9ed; 一、開篇導語&#xff1a;為什么緩存是高并發系統的命脈&#xff1f;?1.1 緩存的核心價值緩存帶來的收益??&…