十大排序算法匯總

好的,下面為你整理一篇面試全覆蓋、極其深入的十大排序算法總結博客,涵蓋算法原理、復雜度、穩定性、應用場景、工程實踐、C++與Python實現(含詳細注釋),并對比分析各種排序的優缺點與適用情境。內容力求結構清晰、講解透徹,適合面試復習與深入學習。


十大排序算法全解析(面試高頻+工程實用)

一、排序算法總覽

排序算法平均時間復雜度最好最壞空間復雜度穩定性適用場景/特點
冒泡排序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^1.3~2)O(n)O(n2)O(1)不穩定中等規模/優化插入
歸并排序O(nlogn)O(nlogn)O(nlogn)O(n)穩定大規模/鏈表/外部排序
快速排序O(nlogn)O(nlogn)O(n2)O(logn)不穩定大規模/工程常用
堆排序O(nlogn)O(nlogn)O(nlogn)O(1)不穩定大規模/原地排序
計數排序O(n+k)O(n+k)O(n+k)O(n+k)穩定整數/范圍小
基數排序O(d(n+k))O(d(n+k))O(d(n+k))O(n+k)穩定整數/字符串/大數據
桶排序O(n)~O(n2)O(n)O(n2)O(n+k)穩定均勻分布/浮點數

穩定性:相等元素排序后相對順序是否保持不變。
空間復雜度:是否原地排序,是否需要輔助數組。
適用場景:數據規模、分布、是否有負數、是否鏈表等。


二、三種元素交換方法(C++/Python)

1. 臨時變量法(推薦,安全)

void swap(int &a, int &b) {int tmp = a;a = b;b = tmp;
}
def swap(arr, i, j):arr[i], arr[j] = arr[j], arr[i]

2. 加減法(需防溢出,i!=j)

void swap(int &a, int &b) {if (&a == &b) return;a = a + b;b = a - b;a = a - b;
}

3. 異或法(僅限整數,i!=j)

void swap(int &a, int &b) {if (&a == &b) return;a ^= b;b ^= a;a ^= b;
}

三、十大排序算法詳解

1. 冒泡排序(Bubble Sort)

原理
  • 每輪將最大(或最小)元素“冒泡”到末尾。
  • 優化:若一輪無交換,提前結束。
復雜度
  • 時間:O(n2),最好O(n)(已排序)
  • 空間:O(1)
  • 穩定性:穩定
C++實現
void bubbleSort(vector<int>& arr) {int n = arr.size();for (int i = 0; i < n - 1; ++i) {bool swapped = false;for (int j = 1; j < n - i; ++j) {if (arr[j-1] > arr[j]) {swap(arr[j-1], arr[j]);swapped = true;}}if (!swapped) break; // 已有序,提前結束}
}
Python實現
def bubble_sort(arr):n = len(arr)for i in range(n-1):swapped = Falsefor j in range(1, n-i):if arr[j-1] > arr[j]:arr[j-1], arr[j] = arr[j], arr[j-1]swapped = Trueif not swapped:break
應用場景
  • 小規模、基本有序數組
  • 代碼簡單,教學常用

2. 選擇排序(Selection Sort)

原理
  • 每輪選擇最小(或最大)元素放到前面。
復雜度
  • 時間:O(n2)
  • 空間:O(1)
  • 穩定性:不穩定(跨越交換)
C++實現
void selectionSort(vector<int>& arr) {int n = arr.size();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;if (minIdx != i) swap(arr[i], arr[minIdx]);}
}
Python實現
def selection_sort(arr):n = len(arr)for i in range(n-1):min_idx = ifor j in range(i+1, n):if arr[j] < arr[min_idx]:min_idx = jif min_idx != i:arr[i], arr[min_idx] = arr[min_idx], arr[i]
應用場景
  • 小規模、交換次數少
  • 不要求穩定性

3. 插入排序(Insertion Sort)

原理
  • 每次將一個元素插入到已排序部分的合適位置。
復雜度
  • 時間:O(n2),最好O(n)
  • 空間:O(1)
  • 穩定性:穩定
C++實現
void insertionSort(vector<int>& arr) {int n = arr.size();for (int i = 1; i < n; ++i) {int key = arr[i], j = i - 1;while (j >= 0 && arr[j] > key) {arr[j+1] = arr[j];--j;}arr[j+1] = key;}
}
Python實現
def insertion_sort(arr):n = len(arr)for i in range(1, n):key = arr[i]j = i - 1while j >= 0 and arr[j] > key:arr[j+1] = arr[j]j -= 1arr[j+1] = key
應用場景
  • 小規模、基本有序
  • 鏈表排序

4. 希爾排序(Shell Sort)

原理
  • 分組插入排序,逐步縮小gap,最終gap=1變插入排序。
  • 增量序列影響復雜度(Shell/Hibbard/Knuth/Sedgewick等)。
復雜度
  • 時間:O(n^1.3~2),依賴gap序列
  • 空間:O(1)
  • 穩定性:不穩定
C++實現(Shell增量)
void shellSort(vector<int>& arr) {int n = arr.size();for (int gap = n/2; gap > 0; gap /= 2) {for (int i = gap; i < n; ++i) {int temp = arr[i], j = i;while (j >= gap && arr[j-gap] > temp) {arr[j] = arr[j-gap];j -= gap;}arr[j] = temp;}}
}
Python實現
def shell_sort(arr):n = len(arr)gap = n // 2while gap > 0:for i in range(gap, n):temp = arr[i]j = iwhile j >= gap and arr[j-gap] > temp:arr[j] = arr[j-gap]j -= gaparr[j] = tempgap //= 2
應用場景
  • 中等規模
  • 插入排序的優化

5. 歸并排序(Merge Sort)

原理
  • 分治法,遞歸分成兩半,合并時排序。
復雜度
  • 時間:O(nlogn)
  • 空間:O(n)(非原地)
  • 穩定性:穩定
C++實現
void merge(vector<int>& arr, int l, int m, int r) {vector<int> left(arr.begin()+l, arr.begin()+m+1);vector<int> right(arr.begin()+m+1, arr.begin()+r+1);int i = 0, j = 0, k = l;while (i < left.size() && j < right.size())arr[k++] = (left[i] <= right[j]) ? left[i++] : right[j++];while (i < left.size()) arr[k++] = left[i++];while (j < right.size()) arr[k++] = right[j++];
}
void mergeSort(vector<int>& arr, int l, int r) {if (l >= r) return;int m = l + (r-l)/2;mergeSort(arr, l, m);mergeSort(arr, m+1, r);merge(arr, l, m, r);
}
Python實現
def merge_sort(arr):if len(arr) <= 1:return arrmid = len(arr)//2left = merge_sort(arr[:mid])right = merge_sort(arr[mid:])res = []i = j = 0while i < len(left) and j < len(right):if left[i] <= right[j]:res.append(left[i])i += 1else:res.append(right[j])j += 1res.extend(left[i:])res.extend(right[j:])return res
應用場景
  • 大規模、鏈表排序
  • 外部排序(磁盤/大數據)

6. 快速排序(Quick Sort)

原理
  • 分治法,選主元分區,遞歸排序兩側。
  • 主元選取方式影響性能(首位/隨機/三數取中)。
復雜度
  • 時間:O(nlogn),最壞O(n2)
  • 空間:O(logn)(遞歸棧)
  • 穩定性:不穩定
C++實現(隨機主元)
int partition(vector<int>& arr, int l, int r) {int pivot = arr[l];int i = l+1, j = r;while (true) {while (i <= j && arr[i] < pivot) ++i;while (i <= j && arr[j] > pivot) --j;if (i >= j) break;swap(arr[i++], arr[j--]);}swap(arr[l], arr[j]);return j;
}
void quickSort(vector<int>& arr, int l, int r) {if (l >= r) return;int mid = l + rand() % (r-l+1);swap(arr[l], arr[mid]);int p = partition(arr, l, r);quickSort(arr, l, p-1);quickSort(arr, p+1, r);
}
Python實現
import random
def quick_sort(arr, l, r):if l >= r:returnpivot_idx = random.randint(l, r)arr[l], arr[pivot_idx] = arr[pivot_idx], arr[l]pivot = arr[l]i, j = l+1, rwhile True:while i <= j and arr[i] < pivot:i += 1while i <= j and arr[j] > pivot:j -= 1if i >= j:breakarr[i], arr[j] = arr[j], arr[i]i += 1j -= 1arr[l], arr[j] = arr[j], arr[l]quick_sort(arr, l, j-1)quick_sort(arr, j+1, r)
應用場景
  • 工程常用,STL/Java/Python底層排序
  • 大規模、內存排序

7. 堆排序(Heap Sort)

原理
  • 構建大頂堆,每次取堆頂與末尾交換,重建堆。
復雜度
  • 時間:O(nlogn)
  • 空間:O(1)
  • 穩定性:不穩定
C++實現
void heapify(vector<int>& arr, int n, int i) {int largest = i, l = 2*i+1, r = 2*i+2;if (l < n && arr[l] > arr[largest]) largest = l;if (r < n && arr[r] > arr[largest]) largest = r;if (largest != i) {swap(arr[i], arr[largest]);heapify(arr, n, largest);}
}
void heapSort(vector<int>& arr) {int n = arr.size();for (int i = n/2-1; i >= 0; --i)heapify(arr, n, i);for (int i = n-1; i > 0; --i) {swap(arr[0], arr[i]);heapify(arr, i, 0);}
}
Python實現
def heapify(arr, n, i):largest = il, r = 2*i+1, 2*i+2if l < n and arr[l] > arr[largest]:largest = lif r < n and arr[r] > arr[largest]:largest = rif largest != i:arr[i], arr[largest] = arr[largest], arr[i]heapify(arr, n, largest)def heap_sort(arr):n = len(arr)for i in range(n//2-1, -1, -1):heapify(arr, n, i)for i in range(n-1, 0, -1):arr[0], arr[i] = arr[i], arr[0]heapify(arr, i, 0)
應用場景
  • 原地排序,內存受限
  • TopK問題(優先隊列)

8. 計數排序(Counting Sort)

原理
  • 統計每個數出現次數,累加輸出。
  • 適合整數、范圍小。
復雜度
  • 時間:O(n+k)
  • 空間:O(n+k)
  • 穩定性:穩定(優化后)
C++實現
vector<int> countingSort(const vector<int>& arr) {if (arr.empty()) return {};int minVal = *min_element(arr.begin(), arr.end());int maxVal = *max_element(arr.begin(), arr.end());vector<int> count(maxVal-minVal+1, 0);for (int num : arr) count[num-minVal]++;vector<int> res;for (int i = 0; i < count.size(); ++i)for (int j = 0; j < count[i]; ++j)res.push_back(i+minVal);return res;
}
Python實現
def counting_sort(arr):if not arr:return []min_val, max_val = min(arr), max(arr)count = [0] * (max_val - min_val + 1)for num in arr:count[num - min_val] += 1res = []for i, c in enumerate(count):res.extend([i + min_val] * c)return res
應用場景
  • 整數、范圍小
  • 計分、桶分布

9. 基數排序(Radix Sort)

原理
  • 按位(低到高/高到低)多輪計數排序。
  • 適合整數、字符串。
復雜度
  • 時間:O(d(n+k)),d為位數
  • 空間:O(n+k)
  • 穩定性:穩定
C++實現
void radixSort(vector<int>& arr) {int maxVal = *max_element(arr.begin(), arr.end());for (int exp = 1; maxVal/exp > 0; exp *= 10) {vector<int> output(arr.size()), count(10, 0);for (int num : arr) count[(num/exp)%10]++;for (int i = 1; i < 10; ++i) count[i] += count[i-1];for (int i = arr.size()-1; i >= 0; --i) {int idx = (arr[i]/exp)%10;output[--count[idx]] = arr[i];}arr = output;}
}
Python實現
def radix_sort(arr):if not arr:return []max_val = max(arr)exp = 1while max_val // exp > 0:count = [0] * 10output = [0] * len(arr)for num in arr:count[(num // exp) % 10] += 1for i in range(1, 10):count[i] += count[i-1]for i in range(len(arr)-1, -1, -1):idx = (arr[i] // exp) % 10output[count[idx]-1] = arr[i]count[idx] -= 1arr = output[:]exp *= 10return arr
應用場景
  • 大量整數、字符串排序
  • 電話號碼、身份證號等

10. 桶排序(Bucket Sort)

原理
  • 劃分區間到多個桶,桶內排序,合并輸出。
  • 適合均勻分布、浮點數。
復雜度
  • 時間:O(n)~O(n2)
  • 空間:O(n+k)
  • 穩定性:取決于桶內排序
C++實現
void bucketSort(vector<float>& arr) {int n = arr.size();vector<vector<float>> buckets(n);for (float num : arr) {int idx = n * num; // 假設[0,1)buckets[idx].push_back(num);}for (auto& bucket : buckets)sort(bucket.begin(), bucket.end());int idx = 0;for (auto& bucket : buckets)for (float num : bucket)arr[idx++] = num;
}
Python實現
def bucket_sort(arr):n = len(arr)buckets = [[] for _ in range(n)]for num in arr:idx = int(n * num)  # 假設[0,1)buckets[idx].append(num)for bucket in buckets:bucket.sort()res = []for

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

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

相關文章

零基礎 “入坑” Java--- 七、數組(二)

文章目錄 一、數組轉字符串二、數組的拷貝三、求數組中元素的平均值四、查找數組中指定元素&#xff08;順序查找&#xff09;五、數組排序&#xff08;冒泡排序&#xff09;六、查找數組中指定元素&#xff08;二分查找&#xff09;七、判斷兩個數組中的元素是否相等八、填充數…

【C++ 真題】P1104 生日

P1104 生日 題目描述 cjf 君想調查學校 OI 組每個同學的生日&#xff0c;并按照年齡從大到小的順序排序。但 cjf 君最近作業很多&#xff0c;沒有時間&#xff0c;所以請你幫她排序。 輸入格式 輸入共有 n 1 n 1 n1 行&#xff0c; 第 1 1 1 行為 OI 組總人數 n n n&…

Oracle DB和PostgreSQL,OpenGauss主外鍵一致性的區別

針對于unique索引在主外鍵上的表現&#xff0c;o和PG的行為確實不一致&#xff0c;測試樣例&#xff1a;PG:測試1&#xff1a;test# CREATE TABLE gdb_editingtemplates ( objectid INTEGER NOT NULL, globalid VARCHAR(38) DEFAULT {00000000-0000-0000-0000-000000000000} …

06.自動化測試概念

自動化測試概念 1. 自動化1.1 回歸測試1.2 自動化分類 1.3 自動化測試金字塔2. web自動化測試3.Selenium 1. 自動化 ? **自動化測試&#xff08;Automated Testing&#xff09;&#xff1a;**是指使用軟件工具或腳本來自動執行測試任務&#xff0c;代替人工進行重復性、繁瑣的…

頁面登錄數據的加密(前端+后端)

本加密過程使用的 AESRSA概要1.使用AES對傳輸數據進行加密AES為對稱加密,加密和解決所需要的key是一樣的,所以攔截到AES key就可以直接解密,所以需要結果RSA進行加密2.對AES的key進行RSA加密RSA為非對稱加密,客戶端只能獲取到publicKey(公鑰),而解密只能使用服務器的privateKey…

PC端基于SpringBoot架構控制無人機(一):初識無人機控制

一、無人機飛控系統的概述飛控&#xff08;Flight Controller&#xff09;是無人機最為核心的組成部分之一&#xff0c;負責實現無人機的自主飛行控制和穩定飛行。飛控系統的功能決定了無人機的飛行性能&#xff0c;包括飛行的穩定性、操控的響應速度、導航的精確度等。通過飛控…

QT6 源(154)模型視圖架構里的列表視圖 QListView:先學習屬性部分,

&#xff08;1&#xff09;屬性總圖&#xff0c;以及測試程序的框架 &#xff1a; 開始屬性的學習 &#xff1a; &#xff08;2&#xff09; 繼續屬性學習 &#xff1a; &#xff08;3&#xff09; 謝謝

MySQL——9、事務管理

事務管理 1、什么是事務&#xff1f;2、事務常見操作方式3、事務隔離級別4、數據庫并發場景4.1、讀-寫4.2、RR與RC的本質區別 1、什么是事務&#xff1f; mysql是基于CS模式的&#xff0c;是一套網絡服務&#xff0c;所以我們是可以在本地連接上遠程服務器的mysql服務端的。my…

Python之面向對象詳解(一篇足矣)

目錄 一、初階面向對象 1. 初識面向對象 1.1 對象和self 1.2 常見成員 1.3 應用示例 將數據封裝到一個對象&#xff0c;便于以后使用。 將數據封裝到對象中&#xff0c;在方法中對原始數據進行加工處理。 根據類創建多個對象&#xff0c;在方法中對對象中的數據進行修改…

【Qt】qml組件對象怎么傳遞給c++

將QML組件對象傳遞給C的方法 在QML和C之間傳遞完整的組件對象需要特殊處理&#xff0c;因為QML組件是動態創建的JavaScript對象。以下是幾種有效的方法&#xff1a; 1. 使用QObject指針傳遞 C端設置 // MyClass.h #include <QObject> #include <QQuickItem>cla…

Java基礎 集合框架 List框架

list架構 list接口list 核心特性以及擴展Collection的體現 抽象類 AbstractList抽象類 AbstractSequentialList (簡化鏈表的順序訪問)AbstractSequentialList 核心特點自定義實現示例代碼講解其實現原理AbstractSequentialList 總結與AbstractList的對比 List 實現類 ArrayList…

2025年6月28和29日復習和預習(C++)

學習筆記大綱?一、預習部分&#xff1a;數組基礎?&#xff08;一&#xff09;核心知識點?數組的創建&#xff1a;掌握一維數組的聲明方式&#xff0c;如int arr[5];&#xff08;創建一個包含 5 個整數的數組&#xff09;。重點在于理解數組長度需為常量&#xff0c;且在聲明…

【centos8服務如何給服務器開發3306端口】

在 CentOS 8 中開放 MySQL 默認端口 3306&#xff0c;需要配置防火墻和 SELinux。以下是詳細步驟&#xff1a; 1. 開放防火墻端口&#xff08;Firewalld&#xff09; CentOS 8 默認使用 firewalld 管理防火墻&#xff0c;執行以下命令開放 3306 端口&#xff1a; # 開放 TCP 33…

python系列之:使用md5和sha256完成簽名認證,調用接口

python系列之:使用md5和sha256完成簽名認證,調用接口 MD5簽名和sha256簽名認證md5認證代碼sha256認證代碼拼接簽名生成簽名拼接url調用接口MD5簽名和sha256簽名認證 MD5簽名認證 算法特性: 生成128位(16字節)的哈希值計算速度快已被證明存在碰撞漏洞(不同輸入可能產生相同…

SpringBatch配置與入門實例

通過對SpringBatch基礎概念的了解&#xff0c;參考&#xff1a;SpringBatch使用介紹 任何技術用起來之后&#xff0c;再去探究內部細節的原理&#xff0c;才會事半功倍。下面記錄一下筆者在SpringBoot項目中集成SpringBatch&#xff0c;并且通過一個小的實例展示如何簡單使用它…

spdlog 項目介紹與二次封裝

目錄 介紹 二次封裝 介紹 spdlog 是C開源的第三方日志庫&#xff0c;整個項目在 spdlog 命名空間中。 在 spdlog 命名空間的 level 命名空間里定義了枚舉類型&#xff0c;把日志分為了 5 個等級&#xff1a;trace debug info warn err critical enum level_enum : in…

shell編程之awk命令詳解

1. awk 教程 1.1 調用 awk awk 是一種強大的文本處理工具&#xff0c;在 Linux 系統中廣泛應用于日志分析、數據處理等場景。調用 awk 主要有以下三種方式&#xff1a; 1.1.1 命令行方式 基本語法為&#xff1a; awk (-F filed-separator) commands input-files其中&#…

服務器需要備案嗎?在哪些地區需要備案?

&#x1f3af; 服務器是否需要備案&#xff1f; 是否需要備案&#xff0c;關鍵看以下兩個因素&#xff1a; 服務器所在地&#xff08;機房位置&#xff09; 網站面向的訪問群體&#xff08;境內或境外&#xff09; &#x1f3f7; 中國大陸&#xff08;境內&#xff09;服務器…

HarmonyOS學習3---ArkUI

1、組件 1.1、基礎組件 1.2、布局容器 1.3、頁面導航 1.4、其他組件 2、ArkTs/C混合開發&#xff0c;高性能編碼 3、布局能力&交互歸一 4、實時開發預覽

Java學習第十五部分——MyBatis

目錄 一.概述 二.特點 三.組件 四.Mapper 五.配置文件 六.使用步驟 七.高級功能 八.優點缺點 九.項目實戰 1.打開idea創建一個Java項目&#xff0c;構建系統選“Maven”? 2.創建完成后若依賴報錯&#xff0c;可通過下載或重新加載來解決? 3.配置pom.xml文件&…