📊 排序算法

将数据按特定顺序排列的基础算法,从 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 log n) 快速
排序
O(n log n) 归并
排序
O(n log 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))
  • 近乎有序数据:神经网络辅助排序(智能选择)