在電腦科學與數學中，一個排序演算法是一種能將一串資料依照特定排序方式排列的演算法。最常用到的排序方式是數值順序以及字典順序。有效的排序演算法在一些演算法（例如搜尋演算法與）中是重要的，如此這些演算法才能得到正確解答。排序演算法也用在處理文字資料以及產生人類可讀的輸出結果。基本上，排序演算法的輸出必須遵守下列兩個原則： 輸出結果為遞增序列（遞增是針對所需的排序順序而言） 輸出結果是原輸入的一種排列、或是重組 雖然排序演算法是一個簡單的問題，但是從電腦科學發展以來，在此問題上已經有大量的研究。舉例而言，泡沫排序在 1956 年就已經被研究。雖然大部分人認為這是一個已經被解決的問題，有用的新演算法仍在不斷的被發明。（例子：圖書館排序在 2004 年被發表） 分類 在計算機科學所使用的排序演算法通常依以下標準分類： 計算的時間複雜度（最差、平均、和最好 zhcn 效能；zhtw 表現；），依據串列（list）的大小 n。一般而言，好的 zhcn 效能；zhtw 表現； 是 O nlog n（大 O 符號），壞的 zhcn 效能；zhtw 表現； 是 O n2。對於一個排序理想的 zhcn 效能；zhtw 表現； 是 O n，但平均而言不可能達到。基於比較的排序演算法對大多數輸入而言至少需要 O nlog n。 zhcn 記憶體；zhtw 記憶體； 使用量（以及其他電腦資源的使用） 穩定性：穩定排序演算法會讓原本有相等鍵值的紀錄維持相對次序。也就是如果一個排序演算法是穩定的，當有兩個相等鍵值的紀錄 R 和 S，且在原本的串列中 R 出現在 S 之前，在排序過的串列中 R 也將會是在 S 之前。 排序的方法：插入、交換、選擇、合併等等。 穩定性 當相等的元素是無法分辨的，比如像是整數，穩定性並不是一個問題。然而，假設以下的數對將要以他們的第一個數字來排序。 4 1 3 1 3 7 5 6 在這個狀況下，有可能產生兩種不同的結果，一個是讓相等鍵值的紀錄維持相對的次序，而另外一個則沒有： 3 1 3 7 4 1 5 6 （維持次序） 3 7 3 1 4 1 5 6 （次序被改變） 不穩定排序演算法可能會在相等的鍵值中改變紀錄的相對次序，但是穩定排序演算法從來不會如此。不穩定排序演算法可以被特別地實作為穩定。作這件事情的一個方式是人工擴充鍵值的比較，如此在其他方面相同鍵值的兩個物件間之比較，（比如上面的比較中加入第二個標準：第二個鍵值的大小）就會被決定使用在原先資料次序中的條目，當作一個同分決賽。然而，要記住這種次序通常牽涉到額外的空間負擔。 排序演算法列 表 在這個表格中，n 是要被排序的紀錄數量以及 k 是不同鍵值的數量。 穩定的排序 氣泡排序（bubble sort） O n2 插入排序（insertion sort）O n2 雞尾酒排序（cocktail sort）O n2 桶排序（bucket sort）O n；需要 O k 額外空間 計數排序（counting sort）O nk；需要 O nk 額外空間 歸併排序（merge sort）O nlog n；需要 O n 額外空間 原地歸併排序 O nlog2 n 如果使用最佳的現在版本 二叉排序樹排序（binary tree sort） O nlog n 期望時間；O n2 最壞時間；需要 O n 額外空間 鴿巢排序（pigeonhole sort）O nk；需要 O k 額外空間 基數排序（radix sort）O nk；需要 O n 額外空間 侏儒排序（gnome sort） O n2 圖書館排序（library sort） O nlog n 期望時間；O n2 最壞時間；需要 1varepsilon n 額外空間 （block sort） O nlog n Tim 排序（Timsort）O nlog n 平均、最壞時間；O n 最優時間；需要 O n 額外空間；是目前已知最快的排序演算法，在 Python、Swift、Rust 等語言的內建排序功能中被用作預設演算法 不穩定的排序 選擇排序（selection sort）O n2 希爾排序（shell sort）O nlog2 n 如果使用最佳的現在版本 克洛弗排序（Clover sort）O n 期望時間，O n2 最壞情況 梳排序 O nlog n 堆排序（heap sort）O nlog n （smooth sort） O nlog n 快速排序（quick sort）O nlog n 期望時間，O n2 最壞情況 內省排序（introsort）O nlog n 耐心排序（patience sort）O nlog nk 最壞情況時間，需要額外的 O nk 空間，也需要找到最長的遞增子序列（longest increasing subsequence） 不實用的排序 Bogo 排序 O n times n，最壞的情況下期望時間為無窮。 Stupid 排序 O n3 遞迴版本需要 O n2 額外記憶體 珠排序（bead sort） O n 或 O sqrt n 但需要特別的硬體 煎餅排序 O n 但需要特別的硬體 臭皮匠排序（stooge sort）演算法簡單，但需要約 n27 的時間 簡要比較 名稱 資料物件 穩定性 時間複雜度 時間複雜度 額外空間複雜度 描述 名稱 資料物件 穩定性 平均 最壞 額外空間複雜度 描述 氣泡排序 陣列 O n2 O n2 O 1 （無序區，有序區）。從無序區透過交換找出最大元素放到有序區前端。 選擇排序 陣列 O n2 O n2 O 1 （有序區，無序區）。在無序區裡找一個最小的元素跟在有序區的後面。對陣列：比較得多，換得少。 選擇排序 連結串列 O n2 O n2 O 1 （有序區，無序區）。在無序區裡找一個最小的元素跟在有序區的後面。對陣列：比較得多，換得少。 插入排序 陣列、連結串列 O n2 O n2 O 1 （有序區，無序區）。把無序區的第一個元素插入到有序區的合適的位置。對陣列：比較得少，換得多。 堆排序 陣列 O nlog n O nlog n O 1 （最大堆，有序區）。從堆頂把根卸出來放在有序區之前，再恢復堆。 歸併排序 陣列 O nlog2 n O nlog2 n O 1 把資料分為兩段，從兩段中逐個選最小的元素移入新資料段的末尾。可從上到下或從下到上進行。 歸併排序 陣列 O nlog n O nlog n O n O log n 如果不是從下到上 把資料分為兩段，從兩段中逐個選最小的元素移入新資料段的末尾。可從上到下或從下到上進行。 歸併排序 連結串列 O nlog n O nlog n O 1 把資料分為兩段，從兩段中逐個選最小的元素移入新資料段的末尾。可從上到下或從下到上進行。 快速排序 陣列 O nlog n O n2 O log n （小數，基準元素，大數）。 在區間中隨機挑選一個元素作基準，將小於基準的元素放在基準之前，大於基準的元素放在基準之後，再分別對小數區與大數區進行排序。 快速排序 連結串列 O nlog n O n2 O log n （小數，基準元素，大數）。 在區間中隨機挑選一個元素作基準，將小於基準的元素放在基準之前，大於基準的元素放在基準之後，再分別對小數區與大數區進行排序。 希爾排序 陣列 O nlog2n O n2 O 1 每一輪按照事先決定的間隔進行插入排序，間隔會依次縮小，最後一次一定要是 1。 計數排序 陣列、連結串列 O nm O nm O nm 統計小於等於該元素值的元素的個數 i，於是該元素就放在目標陣列的索引 i 位（i0）。 桶排序 陣列、連結串列 O n O n2 O m 將值為 i 的元素放入 i 號桶，最後依次把桶裡的元素倒出來。 基數排序 陣列、連結串列 O ktimes n O n2 一種多關鍵字的排序演算法，可用桶排序實現。 均按從小到大排列 k 代表數值中的 數位 個數 n 代表資料規模 m 代表資料的最大值減最小值 參考文獻 外部連結 不同排序演算法間的比較（英語） 一些排序演算法的 C 及 Pascal 實現 視覺化排序