📜  c++中的stl排序(1)

📅  最后修改于: 2023-12-03 15:29:54.067000             🧑  作者: Mango

C++中的STL排序

在C++中,STL(标准模板库)中的sort函数可以方便地对各种数据类型进行排序。本文将介绍STL排序的使用及其内部原理。

使用

STL的sort函数位于头文件中,其原型如下:

template < class RandomIt >
void sort( RandomIt first, RandomIt last );

template < class RandomIt, class Compare >
void sort( RandomIt first, RandomIt last, Compare comp );

其中,第一个原型是最简单的形式,用于对指定范围内的元素进行排序。第二个原型则允许指定排序时的比较方式。

具体使用方法如下:

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

int main() {
    std::vector<int> v = {3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5};
    std::sort(v.begin(), v.end());
    for (int i : v) {
        std::cout << i << " ";
    }
    return 0;
}

输出为:

1 1 2 3 3 4 5 5 5 6 9
自定义比较函数

sort函数默认使用<运算符进行比较。如果需要自定义比较函数,可以通过第二个原型进行指定。

自定义比较函数需要满足以下条件:

  • 函数返回值类型为bool;
  • 函数接收两个参数,分别为待比较的两个元素;
  • 如果第一个元素小于第二个元素,函数返回true;否则返回false。

例如,可以通过以下方式对上文中的示例进行逆序排序:

bool cmp(int x, int y) {
    return x > y;
}

int main() {
    std::vector<int> v = {3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5};
    std::sort(v.begin(), v.end(), cmp);
    for (int i : v) {
        std::cout << i << " ";
    }
    return 0;
}

输出为:

9 6 5 5 5 4 3 3 2 1 1
内部原理

STL的sort函数使用快速排序(QuickSort)算法进行排序。快速排序是一种经典的排序算法,其时间复杂度为O(nlogn),比插入排序和冒泡排序等算法要快得多。

具体实现时,sort函数先将数组分成两部分,左边的元素均小于或等于右边的元素,然后递归地对左右两部分继续排序,直到所有元素都被排序为止。

尽管快速排序具有较好的时间复杂度,但如果排序的数组过大时,会导致栈溢出或性能下降等问题。STL的sort函数因此还引入了堆排序(HeapSort)和归并排序(MergeSort)等算法,以保证各种情况下都能获得较好的性能。