在 C++ 标准模板库(STL) 中排序

Suraj P 2023年1月30日 2022年4月20日
  1. 在 C++ 中使用 sort() 函数对数组或 STL 容器进行排序
  2. 在 C++ 中按降序对数组进行排序
  3. 使用 partial_sort() 函数对数组或向量的一部分进行排序
  4. 使用 C++ 中的 sort() 函数的用户定义或自定义排序
  5. 在 C++ 中使用 is_sorted() 方法
  6. 排序算法的时间复杂度
在 C++ 标准模板库(STL) 中排序

在本教程中,我们将学习一个广泛使用的 C++ 函数,称为 sort()。我们还将查看与排序相关的其他功能。

为了在 C++ 中对数据进行排序,我们编写算法并将其应用于数据,或者我们可以使用 C++ STL 中的内置函数 sort()sort() 函数在 algorithm 头文件中定义。

此函数使用 IntroSort 算法,这是一种混合排序算法,它使用三种排序算法,快速排序、堆排序和插入排序,以最大限度地减少运行时间。

此函数对给定范围的元素进行排序。

语法:

sort(start iterator, end iterator, compare_function)

默认情况下,这将按升序对开始迭代器和结束迭代器定义的范围内的元素进行排序(这是默认的 compare_function)。

在 C++ 中使用 sort() 函数对数组或 STL 容器进行排序

排序是对数据执行的基本操作之一。我们以递增、递减或用户定义(自定义排序)的方式排列数据。

我们可以在 C++ 中使用 sort() 函数对数组或 STL 容器(如 vector、set、map 等)进行排序。

#include <algorithm>
#include <iostream>
using namespace std;

int main()
{
    int arr[] = { 1, 5, 8, 9, 6, 7, 3, 4, 2, 0 };

    //array size
    int n = sizeof(arr) / sizeof(arr[0]);

    vector<int> v{35,67,11,-9,7,-22}; //vector

    cout << "The array  after sorting is : \n";

    sort(arr, arr + n);
    sort(v.begin(),v.end()); //sorting vector

    for (int i = 0; i < n; ++i)
        cout << arr[i] << " ";

    cout<<endl;

    cout << "The vector after sorting is : \n";
    for (int i = 0; i <v.size(); ++i)
        cout << v[i] << " ";
}

输出:

The array  after sorting is :
0 1 2 3 4 5 6 7 8 9
The vector after sorting is :
-22 -9 7 11 35 67

默认情况下,项目按升序排列。

在 C++ 中按降序对数组进行排序

要按降序对 C++ STL 中存在的数组或容器进行排序,我们必须在 sort() 函数中传递名为 greater<type>() 的第三个参数。此函数执行比较,以便最后的元素按降序排序。

Type 指的是我们正在使用的数组或容器的类型,int、float 或 string 类型。

#include <algorithm>
#include <iostream>
using namespace std;

int main()
{
    int arr[] = { 1, 5, 8, 9, 6, 7, 3, 4, 2, 0 };

    //array size
    int n = sizeof(arr) / sizeof(arr[0]);

    vector<int> v{35,67,11,-9,7,-22}; //vector

    cout << "The array  after sorting is : \n";

    sort(arr, arr + n,greater<int>());
    sort(v.begin(),v.end(),greater<int>()); //sorting vector

    for (int i = 0; i < n; ++i)
        cout << arr[i] << " ";

    cout<<endl;

    cout << "The vector after sorting is : \n";
    for (int i = 0; i <v.size(); ++i)
        cout << v[i] << " ";
}

输出:

The array  after sorting is :
9 8 7 6 5 4 3 2 1 0
The vector after sorting is :
67 35 11 7 -9 -22

使用 partial_sort() 函数对数组或向量的一部分进行排序

我们可以使用 partial_sort() 对数组的某些部分进行排序。这种方法只不过是原始排序方法的变体

语法:

partial_sort(first, middle, last)

它重新排列范围(firstlast)中的元素,以便中间之前的元素按升序排序,中间之后的元素没有任何特定顺序。

#include <algorithm>
#include <iostream>
using namespace std;

int main()
{

   vector<int> vr{35,67,11,-9,7,-22}; //vector

    cout << "The vector after partial sorting is : \n";

    partial_sort(vr.begin(),vr.begin()+2,vr.end());

    for (int i = 0; i < vr.size(); ++i)
        cout << vr[i] << " ";
}

输出:

The vector after partial sorting is :
-22 -9 67 35 11 7

我们可以观察到只有前两个元素被排序,剩下的只是以某种随机顺序出现。

使用 C++ 中的 sort() 函数的用户定义或自定义排序

只要我们想对数据进行升序或降序排序,都可以使用这个函数,但有时我们希望数据以用户自定义的方式排序。

在这里,我们必须编写自定义排序函数,我们将作为第三个参数传递给 sort() 函数。

#include <algorithm>
#include <iostream>
using namespace std;

bool myfunction(string x, string y)
{
	return x.size() < y.size() ;
}

int main()
{
    string str[]={"a" ,"abc", "ba" , "abcd"};
    int n = 4;

    sort(str, str+n); //normal sort function
    cout << "Array after sorting : \n";
    for (int i = 0; i < n; ++i)
        cout << str[i] << " ";

    cout<<endl;

    sort(str,str+n,myfunction);
     cout << "Array after user defined sorting : \n";
    for (int i = 0; i < n; ++i)
        cout << str[i] << " ";
}

输出:

Array after sorting :
a abc abcd ba
Array after user defined sorting :
a ba abc abcd

第一种排序方法默认按字典升序对字符串数组进行排序。第二种排序方法根据字符串的长度对字符串进行排序,即我们在名为 myfunction 的自定义比较函数中提到的条件。

在 C++ 中使用 is_sorted() 方法

如果我们想检查给定范围的数据是否排序,我们可以使用这种方法。

#include <algorithm>
#include <iostream>
using namespace std;

int main()
{

  vector<int> v{35,67,11,-9,7,-22}; //vector

  cout<<is_sorted(v.begin(), v.end());

}

输出:

0

由于向量没有排序,我们得到的输出为 0,意思是

排序算法的时间复杂度

sort() 的时间复杂度为 O(NlogN),其中 N 是应用 sort() 函数的元素的数量。

Author: Suraj P
Suraj P avatar Suraj P avatar

A technophile and a Big Data developer by passion. Loves developing advance C++ and Java applications in free time works as SME at Chegg where I help students with there doubts and assignments in the field of Computer Science.

LinkedIn GitHub

相关文章 - C++ Sorting