C++介绍排序算法

一、基础排序算法(�(�2)O(n2))

1. 冒泡排序

原理:通过相邻元素比较交换,将最大元素逐渐“冒泡”到末尾
C++实现

void bubbleSort(vector<int>& arr) {
    for (int i = 0; i < arr.size()-1; ++i) {
        for (int j = 0; j < arr.size()-i-1; ++j) {
            if (arr[j] > arr[j+1]) {
                swap(arr[j], arr[j+1]);
            }
        }
    }
}

特点:稳定排序,原地操作,适合小数据量

2. 选择排序

原理:每次选择未排序部分的最小元素,放到已排序序列末尾
C++实现:

void selectionSort(vector<int>& arr) {
    for (int i = 0; i < arr.size()-1; ++i) {
        int minIdx = i;
        for (int j = i+1; j < arr.size(); ++j) {
            if (arr[j] < arr[minIdx]) minIdx = j;
        }
        swap(arr[i], arr[minIdx]);
    }
}

特点:不稳定排序,交换次数少(�(�)O(n)次)

3. 插入排序

原理:将每个元素插入到已排序序列中的正确位置
C++实现:

void insertionSort(vector<int>& arr) {
    for (int i = 1; i < arr.size(); ++i) {
        int key = arr[i], j = i-1;
        while (j >= 0 && arr[j] > key) {
            arr[j+1] = arr[j];
            --j;
        }
        arr[j+1] = key;
    }
}

特点:稳定排序,适合近乎有序的数据


二、高效排序算法(�(�log⁡�)O(nlogn))

1. 快速排序

原理:分治法,选取基准元素将数组划分为两个子数组
C++实现:

int partition(vector<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) {
            swap(arr[++i], arr[j]);
        }
    }
    swap(arr[i+1], arr[high]);
    return i+1;
}

void quickSort(vector<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);
    }
}

特点:平均最快,但最坏情况�(�2)O(n2),不稳定

2. 归并排序

原理:分治法,将数组分为两半分别排序后合并
C++实现

void merge(vector<int>& arr, int l, int m, int r) {
    vector<int> temp(r-l+1);
    int i = l, j = m+1, k = 0;
    while (i <= m && j <= r) {
        temp[k++] = (arr[i] <= arr[j]) ? arr[i++] : arr[j++];
    }
    while (i <= m) temp[k++] = arr[i++];
    while (j <= r) temp[k++] = arr[j++];
    for (int p = 0; p < k; ++p) arr[l+p] = temp[p];
}

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);
}

特点:稳定排序,需要�(�)O(n)额外空间

3. 堆排序

原理:利用最大堆数据结构进行排序
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) {
    // 建堆
    for (int i = arr.size()/2-1; i >= 0; --i)
        heapify(arr, arr.size(), i);
    // 排序
    for (int i = arr.size()-1; i > 0; --i) {
        swap(arr[0], arr[i]);
        heapify(arr, i, 0);
    }
}

特点:原地排序,不稳定,适合大数据量


三、特殊场景排序

1. 计数排序(�(�+�)O(N+K))

适用整数排序,k为数据范围

2. 基数排序(�(�(�+�))O(D(N+K)))

按位数逐位排序

3. 桶排序(�(�)O(N))

数据均匀分布时高效


四、对比总结

算法平均时间复杂度空间复杂度稳定性适用场景
冒泡排序�(�2)O(n2)�(1)O(1)稳定教学示例
快速排序�(�log⁡�)O(nlogn)�(log⁡�)O(logn)不稳定通用排序
归并排序�(�log⁡�)O(nlogn)�(�)O(n)稳定链表排序、外部排序
堆排序�(�log⁡�)O(nlogn)�(1)O(1)不稳定内存受限场景

实际应用中建议优先使用STL的sort()(基于快速排序的混合算法)或stable_sort()(归并排序实现)。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值