linux

Linux C++中如何实现高效排序算法

小樊
47
2025-06-09 16:19:12
栏目: 编程语言

在Linux环境下使用C++实现高效的排序算法,可以采用多种方法。以下介绍几种常用且高效的排序算法,并附上相应的C++实现示例:

1. 标准库中的 std::sort

C++标准库提供了高效的排序函数 std::sort,它通常基于快速排序(QuickSort),并结合了插入排序(Insertion Sort)和堆排序(HeapSort)以保证最坏情况下的性能。std::sort 在大多数情况下表现优异,是首选的排序方法。

示例代码

#include <iostream>
#include <vector>
#include <algorithm>

int main() {
    std::vector<int> data = {5, 2, 9, 1, 5, 6};
    
    // 使用 std::sort 进行排序
    std::sort(data.begin(), data.end());
    
    // 输出排序结果
    for(const auto &num : data){
        std::cout << num << " ";
    }
    return 0;
}

编译与运行

g++ -o sort_example sort_example.cpp
./sort_example

2. 归并排序(Merge Sort)

归并排序是一种稳定的排序算法,时间复杂度为O(n log n)。适用于需要稳定排序的场景。

示例代码

#include <iostream>
#include <vector>

void merge(std::vector<int> &data, int left, int mid, int right) {
    std::vector<int> temp(right - left + 1);
    int i = left, j = mid + 1, k = 0;
    
    while(i <= mid && j <= right){
        if(data[i] <= data[j]){
            temp[k++] = data[i++];
        }
        else{
            temp[k++] = data[j++];
        }
    }
    
    while(i <= mid){
        temp[k++] = data[i++];
    }
    
    while(j <= right){
        temp[k++] = data[j++];
    }
    
    for(int p = 0; p < temp.size(); ++p){
        data[left + p] = temp[p];
    }
}

void mergeSort(std::vector<int> &data, int left, int right){
    if(left >= right) return;
    int mid = left + (right - left) / 2;
    mergeSort(data, left, mid);
    mergeSort(data, mid + 1, right);
    merge(data, left, mid, right);
}

int main(){
    std::vector<int> data = {38, 27, 43, 3, 9, 82, 10};
    mergeSort(data, 0, data.size() - 1);
    
    for(const auto &num : data){
        std::cout << num << " ";
    }
    return 0;
}

3. 快速排序(QuickSort)

快速排序是一种高效的排序算法,平均时间复杂度为O(n log n)。通过选择合适的枢轴(pivot)可以优化性能。

示例代码

#include <iostream>
#include <vector>

int partition(std::vector<int> &data, int low, int high){
    int pivot = data[high]; // 选择最后一个元素作为枢轴
    int i = low - 1;
    
    for(int j = low; j < high; ++j){
        if(data[j] <= pivot){
            i++;
            std::swap(data[i], data[j]);
        }
    }
    std::swap(data[i + 1], data[high]);
    return i + 1;
}

void quickSort(std::vector<int> &data, int low, int high){
    if(low < high){
        int pi = partition(data, low, high);
        quickSort(data, low, pi - 1);
        quickSort(data, pi + 1, high);
    }
}

int main(){
    std::vector<int> data = {10, 7, 8, 9, 1, 5};
    quickSort(data, 0, data.size() - 1);
    
    for(const auto &num : data){
        std::cout << num << " ";
    }
    return 0;
}

4. 堆排序(Heap Sort)

堆排序利用堆这种数据结构进行排序,时间复杂度为O(n log n),且不需要额外的空间。

示例代码

#include <iostream>
#include <vector>

void heapify(std::vector<int> &data, int n, int i){
    int largest = i;
    int left = 2 * i + 1;
    int right = 2 * i + 2;
    
    if(left < n && data[left] > data[largest]){
        largest = left;
    }
    
    if(right < n && data[right] > data[largest]){
        largest = right;
    }
    
    if(largest != i){
        std::swap(data[i], data[largest]);
        heapify(data, n, largest);
    }
}

void heapSort(std::vector<int> &data){
    int n = data.size();
    
    // 构建最大堆
    for(int i = n / 2 - 1; i >= 0; --i){
        heapify(data, n, i);
    }
    
    // 一个个从堆中取出元素
    for(int i = n - 1; i >= 0; --i){
        std::swap(data[0], data[i]);
        heapify(data, i, 0);
    }
}

int main(){
    std::vector<int> data = {12, 11, 13, 5, 6, 7};
    heapSort(data);
    
    for(const auto &num : data){
        std::cout << num << " ";
    }
    return 0;
}

5. 基数排序(Radix Sort)

基数排序是一种非比较型整数排序算法,适用于整数排序,时间复杂度为O(nk),其中k是数字的位数。

示例代码

#include <iostream>
#include <vector>
#include <algorithm>

// 获取数字的第d位数字
int getDigit(int num, int d){
    int power = 1;
    for(int i = 0; i < d; ++i) power *= 10;
    return (num / power) % 10;
}

void radixSort(std::vector<int> &data){
    if(data.empty()) return;
    
    // 找到最大数以确定位数
    int maxNum = *std::max_element(data.begin(), data.end());
    int digits = 0;
    while(maxNum > 0){
        maxNum /= 10;
        digits++;
    }
    
    std::vector<int> output(data.size());
    std::vector<int> count(10, 0);
    
    int exp = 1;
    for(int d = 0; d < digits; ++d){
        // 清空计数数组
        std::fill(count.begin(), count.end(), 0);
        
        // 统计每个桶中的元素个数
        for(auto num : data){
            int digit = getDigit(num, d);
            count[digit]++;
        }
        
        // 计算每个桶的结束位置
        for(int i = 1; i < 10; ++i){
            count[i] += count[i - 1];
        }
        
        // 将元素放入输出数组中
        for(int i = data.size() - 1; i >= 0; --i){
            int digit = getDigit(data[i], d);
            output[count[digit] - 1] = data[i];
            count[digit]--;
        }
        
        // 将输出数组复制回原数组
        data = output;
    }
}

int main(){
    std::vector<int> data = {170, 45, 75, 90, 802, 66, 2, 24, 6};
    radixSort(data);
    
    for(const auto &num : data){
        std::cout << num << " ";
    }
    return 0;
}

6. 并行排序

对于大规模数据,可以利用多线程或并行计算库(如OpenMP或C++17的并行算法)来加速排序过程。

使用 C++17 并行算法示例

#include <iostream>
#include <vector>
#include <algorithm>
#include <execution>

int main(){
    std::vector<int> data = {5, 2, 9, 1, 5, 6};
    
    // 使用并行排序
    std::sort(std::execution::par, data.begin(), data.end());
    
    for(const auto &num : data){
        std::cout << num << " ";
    }
    return 0;
}

注意:使用并行算法需要确保编译器支持C++17及以上标准,并且在编译时启用相应的标志,例如使用 -std=c++17

总结

在Linux环境下使用C++实现高效排序算法时,推荐优先使用标准库中的 std::sort,因为它经过高度优化,适用于大多数场景。如果需要特定的排序特性(如稳定性或特定数据类型的排序),可以考虑实现归并排序、快速排序或堆排序等经典算法。对于大规模数据,可以探索并行排序以利用多核处理器的优势。

希望以上内容对你有所帮助!

0
看了该问题的人还看了