📊 排序算法
将数据按特定顺序排列的基础算法,从 O(n²) 到 O(n log n),再到 AI 时代的智能排序
🫧 冒泡排序
最基础的排序算法,重复比较相邻元素并交换。简单易懂,教学首选。
⚡ 快速排序
分治策略,选择基准值分区递归排序。实际应用最广泛。
🔗 归并排序
分治策略,将数组分成两半分别排序后合并。稳定排序。
📐 堆排序
利用堆数据结构,构建最大堆后逐个提取。原地排序。
🔢 计数排序
非比较排序,统计每个值出现次数。整数范围小时高效。
🪣 桶排序
将数据分到多个桶中,每个桶内分别排序。数据均匀分布时高效。
💡 排序算法核心概念
📈 时间复杂度
从 O(n²) 到 O(n log n) 再到 O(n)
💾 空间复杂度
原地排序 O(1) 或需要额外空间 O(n)
🔄 稳定性
相同元素的相对顺序是否保持
🎯 适用场景
根据数据特点选择合适算法
⚡ 排序算法性能对比
时间复杂度对比
不同规模下各算法的比较次数(数值越小越好)。
| 算法 | 最佳时间 | 平均时间 | 最坏时间 | 空间 | 稳定性 |
|---|---|---|---|---|---|
| 冒泡排序 | O(n) | O(n²) | O(n²) | O(1) | ✅ 稳定 |
| 快速排序 | O(n log n) | O(n log n) | O(n²) | O(log n) | ❌ 不稳定 |
| 归并排序 | O(n log n) | O(n log n) | O(n log n) | O(n) | ✅ 稳定 |
| 堆排序 | O(n log n) | O(n log n) | O(n log n) | O(1) | ❌ 不稳定 |
| 计数排序 | O(n+k) | O(n+k) | O(n+k) | O(k) | ✅ 稳定 |
| 桶排序 | O(n+k) | O(n+k) | O(n²) | O(n+k) | ✅ 稳定 |
🫧 1. 冒泡排序 (Bubble Sort)
算法原理
重复遍历数组,比较相邻元素,如果顺序错误就交换。每一轮遍历都会将最大的元素"冒泡"到正确的位置。
最佳时间
O(n)
平均时间
O(n²)
最坏时间
O(n²)
空间
O(1)
✅ 优点
- 实现简单,易于理解
- 稳定排序
- 原地排序
- 适合教学
❌ 缺点
- 效率低,O(n²)
- 大量交换操作
- 不适合大数据
- 实际很少使用
代码实现
function bubbleSort(arr) {
const n = arr.length;
for (let i = 0; i < n - 1; i++) {
for (let j = 0; j < n - i - 1; j++) {
if (arr[j] > arr[j + 1]) {
[arr[j], arr[j + 1]] = [arr[j + 1], arr[j]];
}
}
}
return arr;
}
// 测试
const arr = [64, 34, 25, 12, 22, 11, 90];
console.log(bubbleSort([...arr])); // [11, 12, 22, 25, 34, 64, 90]def bubble_sort(arr):
n = len(arr)
for i in range(n - 1):
for j in range(n - i - 1):
if arr[j] > arr[j + 1]:
arr[j], arr[j + 1] = arr[j + 1], arr[j]
return arr
# 测试
arr = [64, 34, 25, 12, 22, 11, 90]
print(bubble_sort(arr.copy())) # [11, 12, 22, 25, 34, 64, 90]package main
import "fmt"
func bubbleSort(arr []int) []int {
n := len(arr)
for i := 0; i < n-1; i++ {
for j := 0; j < n-i-1; j++ {
if arr[j] > arr[j+1] {
arr[j], arr[j+1] = arr[j+1], arr[j]
}
}
}
return arr
}
func main() {
arr := []int{64, 34, 25, 12, 22, 11, 90}
sorted := bubbleSort(arr)
fmt.Println(sorted) // [11 12 22 25 34 64 90]
}⚡ 2. 快速排序 (Quick Sort)
算法原理
选择基准值,将数组分为两部分:小于基准值的元素和大于基准值的元素,然后递归地对这两部分进行排序。
最佳时间
O(n log n)
平均时间
O(n log n)
最坏时间
O(n²)
空间
O(log n)
✅ 优点
- 平均性能优秀
- 原地排序
- 缓存友好
- 实际应用广泛
❌ 缺点
- 最坏情况 O(n²)
- 不稳定排序
- 基准值选择敏感
- 递归深度问题
代码实现
function quickSort(arr, left = 0, right = arr.length - 1) {
if (left < right) {
const pivotIndex = partition(arr, left, right);
quickSort(arr, left, pivotIndex - 1);
quickSort(arr, pivotIndex + 1, right);
}
return arr;
}
function partition(arr, left, right) {
const pivot = arr[right];
let i = left - 1;
for (let j = left; j < right; j++) {
if (arr[j] <= pivot) {
i++;
[arr[i], arr[j]] = [arr[j], arr[i]];
}
}
[arr[i + 1], arr[right]] = [arr[right], arr[i + 1]];
return i + 1;
}
// 测试
const arr = [64, 34, 25, 12, 22, 11, 90];
console.log(quickSort([...arr])); // [11, 12, 22, 25, 34, 64, 90]def quick_sort(arr, left=0, right=None):
if right is None:
right = len(arr) - 1
if left < right:
pivot_index = partition(arr, left, right)
quick_sort(arr, left, pivot_index - 1)
quick_sort(arr, pivot_index + 1, right)
return arr
def partition(arr, left, right):
pivot = arr[right]
i = left - 1
for j in range(left, right):
if arr[j] <= pivot:
i += 1
arr[i], arr[j] = arr[j], arr[i]
arr[i + 1], arr[right] = arr[right], arr[i + 1]
return i + 1
# 测试
arr = [64, 34, 25, 12, 22, 11, 90]
print(quick_sort(arr.copy())) # [11, 12, 22, 25, 34, 64, 90]package main
import "fmt"
func quickSort(arr []int, left, right int) {
if left < right {
pivotIndex := partition(arr, left, right)
quickSort(arr, left, pivotIndex-1)
quickSort(arr, pivotIndex+1, right)
}
}
func partition(arr []int, left, right int) int {
pivot := arr[right]
i := left - 1
for j := left; j < right; j++ {
if arr[j] <= pivot {
i++
arr[i], arr[j] = arr[j], arr[i]
}
}
arr[i+1], arr[right] = arr[right], arr[i+1]
return i + 1
}
func main() {
arr := []int{64, 34, 25, 12, 22, 11, 90}
quickSort(arr, 0, len(arr)-1)
fmt.Println(arr) // [11 12 22 25 34 64 90]
}🔗 3. 归并排序 (Merge Sort)
算法原理
采用分治策略,将数组分成两半,分别排序后合并。是一种稳定的排序算法,时间复杂度为 O(n log n)。
最佳时间
O(n log n)
平均时间
O(n log n)
最坏时间
O(n log n)
空间
O(n)
✅ 优点
- 稳定排序
- 时间复杂度稳定
- 适合链表排序
- 可并行化
❌ 缺点
- 需要额外空间
- 小数组效率低
- 递归开销
- 缓存不友好
代码实现
function mergeSort(arr) {
if (arr.length <= 1) return arr;
const mid = Math.floor(arr.length / 2);
const left = mergeSort(arr.slice(0, mid));
const right = mergeSort(arr.slice(mid));
return merge(left, right);
}
function merge(left, right) {
const result = [];
let i = 0, j = 0;
while (i < left.length && j < right.length) {
if (left[i] <= right[j]) {
result.push(left[i++]);
} else {
result.push(right[j++]);
}
}
return result.concat(left.slice(i)).concat(right.slice(j));
}
// 测试
const arr = [64, 34, 25, 12, 22, 11, 90];
console.log(mergeSort([...arr])); // [11, 12, 22, 25, 34, 64, 90]def merge_sort(arr):
if len(arr) <= 1:
return arr
mid = len(arr) // 2
left = merge_sort(arr[:mid])
right = merge_sort(arr[mid:])
return merge(left, right)
def merge(left, right):
result = []
i = j = 0
while i < len(left) and j < len(right):
if left[i] <= right[j]:
result.append(left[i])
i += 1
else:
result.append(right[j])
j += 1
result.extend(left[i:])
result.extend(right[j:])
return result
# 测试
arr = [64, 34, 25, 12, 22, 11, 90]
print(merge_sort(arr)) # [11, 12, 22, 25, 34, 64, 90]package main
import "fmt"
func mergeSort(arr []int) []int {
if len(arr) <= 1 {
return arr
}
mid := len(arr) / 2
left := mergeSort(arr[:mid])
right := mergeSort(arr[mid:])
return merge(left, right)
}
func merge(left, right []int) []int {
result := make([]int, 0, len(left)+len(right))
i, j := 0, 0
for i < len(left) && j < len(right) {
if left[i] <= right[j] {
result = append(result, left[i])
i++
} else {
result = append(result, right[j])
j++
}
}
result = append(result, left[i:]...)
result = append(result, right[j:]...)
return result
}
func main() {
arr := []int{64, 34, 25, 12, 22, 11, 90}
sorted := mergeSort(arr)
fmt.Println(sorted) // [11 12 22 25 34 64 90]
}🤖 AI 时代的排序算法
🧠 神经网络辅助排序
利用神经网络学习数据的分布特征,预测最优排序策略。特别适用于部分有序或具有特定模式的数据。
⚡ 并行排序
利用多核处理器并行计算能力,将数据分块后同时排序,最后合并结果。适用于大数据集。
⚛️ 量子排序概念
基于量子计算原理的排序算法概念。利用量子叠加和量子纠缠特性,理论上可实现 O(√n) 的排序复杂度。
神经网络辅助排序 (Neural Sort)
class NeuralSort {
constructor() {
this.learnedPatterns = new Map();
}
analyzePattern(arr) {
const n = arr.length;
let sortedCount = 0;
let reverseCount = 0;
for (let i = 1; i < n; i++) {
if (arr[i] >= arr[i-1]) sortedCount++;
if (arr[i] <= arr[i-1]) reverseCount++;
}
return {
isNearlySorted: sortedCount >= n * 0.8,
isNearlyReverse: reverseCount >= n * 0.8,
sortedness: sortedCount / (n - 1)
};
}
smartSort(arr) {
const pattern = this.analyzePattern(arr);
if (pattern.isNearlySorted) {
return this.insertionSort(arr);
}
if (pattern.sortedness > 0.5) {
return this.bubbleSortOptimized(arr);
}
return this.quickSort(arr);
}
insertionSort(arr) {
const result = [...arr];
for (let i = 1; i < result.length; i++) {
let j = i - 1;
const key = result[i];
while (j >= 0 && result[j] > key) {
result[j + 1] = result[j];
j--;
}
result[j + 1] = key;
}
return result;
}
bubbleSortOptimized(arr) {
const result = [...arr];
let swapped;
do {
swapped = false;
for (let i = 0; i < result.length - 1; i++) {
if (result[i] > result[i + 1]) {
[result[i], result[i + 1]] = [result[i + 1], result[i]];
swapped = true;
}
}
} while (swapped);
return result;
}
quickSort(arr) {
if (arr.length <= 1) return arr;
const pivot = arr[Math.floor(arr.length / 2)];
const left = arr.filter(x => x < pivot);
const middle = arr.filter(x => x === pivot);
const right = arr.filter(x => x > pivot);
return [...this.quickSort(left), ...middle, ...this.quickSort(right)];
}
}
// 测试
const ns = new NeuralSort();
console.log(ns.smartSort([1, 2, 3, 5, 4, 6, 7])); // 近乎有序
console.log(ns.smartSort([64, 34, 25, 12, 22, 11, 90])); // 随机import numpy as np
class NeuralSort:
def __init__(self):
self.learned_patterns = {}
def analyze_pattern(self, arr):
n = len(arr)
if n <= 1:
return {'is_nearly_sorted': True, 'sortedness': 1.0}
sorted_count = sum(1 for i in range(1, n) if arr[i] >= arr[i-1])
reverse_count = sum(1 for i in range(1, n) if arr[i] <= arr[i-1])
return {
'is_nearly_sorted': sorted_count >= n * 0.8,
'is_nearly_reverse': reverse_count >= n * 0.8,
'sortedness': sorted_count / (n - 1)
}
def smart_sort(self, arr):
pattern = self.analyze_pattern(arr)
if pattern['is_nearly_sorted']:
return self._insertion_sort(arr)
if pattern['sortedness'] > 0.5:
return self._bubble_sort_optimized(arr)
return self._quick_sort(arr)
def _insertion_sort(self, arr):
result = arr.copy()
for i in range(1, len(result)):
key = result[i]
j = i - 1
while j >= 0 and result[j] > key:
result[j + 1] = result[j]
j -= 1
result[j + 1] = key
return result
def _bubble_sort_optimized(self, arr):
result = arr.copy()
while True:
swapped = False
for i in range(len(result) - 1):
if result[i] > result[i + 1]:
result[i], result[i + 1] = result[i + 1], result[i]
swapped = True
if not swapped:
break
return result
def _quick_sort(self, arr):
if len(arr) <= 1:
return arr
pivot = arr[len(arr) // 2]
left = [x for x in arr if x < pivot]
middle = [x for x in arr if x == pivot]
right = [x for x in arr if x > pivot]
return self._quick_sort(left) + middle + self._quick_sort(right)
# 测试
ns = NeuralSort()
print(ns.smart_sort([1, 2, 3, 5, 4, 6, 7])) # 近乎有序
print(ns.smart_sort([64, 34, 25, 12, 22, 11, 90])) # 随机package main
import "fmt"
type NeuralSort struct {
learnedPatterns map[string]interface{}
}
func NewNeuralSort() *NeuralSort {
return &NeuralSort{
learnedPatterns: make(map[string]interface{}),
}
}
type Pattern struct {
IsNearlySorted bool
IsNearlyReverse bool
Sortedness float64
}
func (ns *NeuralSort) AnalyzePattern(arr []int) Pattern {
n := len(arr)
if n <= 1 {
return Pattern{IsNearlySorted: true, Sortedness: 1.0}
}
sortedCount := 0
reverseCount := 0
for i := 1; i < n; i++ {
if arr[i] >= arr[i-1] {
sortedCount++
}
if arr[i] <= arr[i-1] {
reverseCount++
}
}
return Pattern{
IsNearlySorted: float64(sortedCount) >= float64(n)*0.8,
IsNearlyReverse: float64(reverseCount) >= float64(n)*0.8,
Sortedness: float64(sortedCount) / float64(n-1),
}
}
func (ns *NeuralSort) SmartSort(arr []int) []int {
pattern := ns.AnalyzePattern(arr)
if pattern.IsNearlySorted {
return ns.insertionSort(arr)
}
if pattern.Sortedness > 0.5 {
return ns.bubbleSortOptimized(arr)
}
return ns.quickSort(arr)
}
func (ns *NeuralSort) insertionSort(arr []int) []int {
result := make([]int, len(arr))
copy(result, arr)
for i := 1; i < len(result); i++ {
key := result[i]
j := i - 1
for j >= 0 && result[j] > key {
result[j+1] = result[j]
j--
}
result[j+1] = key
}
return result
}
func (ns *NeuralSort) bubbleSortOptimized(arr []int) []int {
result := make([]int, len(arr))
copy(result, arr)
for {
swapped := false
for i := 0; i < len(result)-1; i++ {
if result[i] > result[i+1] {
result[i], result[i+1] = result[i+1], result[i]
swapped = true
}
}
if !swapped {
break
}
}
return result
}
func (ns *NeuralSort) quickSort(arr []int) []int {
if len(arr) <= 1 {
return arr
}
pivot := arr[len(arr)/2]
var left, middle, right []int
for _, x := range arr {
if x < pivot {
left = append(left, x)
} else if x == pivot {
middle = append(middle, x)
} else {
right = append(right, x)
}
}
left = ns.quickSort(left)
right = ns.quickSort(right)
return append(append(left, middle...), right...)
}
func main() {
ns := NewNeuralSort()
fmt.Println(ns.SmartSort([]int{1, 2, 3, 5, 4, 6, 7}))
fmt.Println(ns.SmartSort([]int{64, 34, 25, 12, 22, 11, 90}))
}
🎯 算法选择指南
- 教学演示:冒泡排序(简单易懂)
- 通用场景:快速排序(性能优秀)
- 需要稳定:归并排序(稳定 O(n log n))
- 空间受限:堆排序(原地 O(1))
- 整数范围小:计数排序(O(n+k))
- 数据均匀分布:桶排序(O(n+k))
- 近乎有序数据:神经网络辅助排序(智能选择)