C++ 中的向量排序

2025年6月14日 | 阅读 7 分钟

在 C++ 中,对向量进行排序是编程中的一项基本功能,因为它将元素组织成有意义的顺序,例如升序或降序。排序对于提高算法效率至关重要。它需要预先排序的信息,以便在顺序很重要时使用,例如数据分析和以友好的格式呈现输出。有效的排序可以显著提高程序的性能,尤其是在处理大型数据集时。

在 C++ 中,有几种方法可以用来对向量进行排序。最有效和最简单的方法是调用 sort() 方法。

C++ 中排序向量的简单示例

让我们看一个示例来说明如何使用 C++ 中的 sort() 函数对向量进行排序。

示例

编译并运行

输出

8 6 5 2 1

说明

在此示例中,我们使用特殊的比较函数以降序对整数向量进行排序。之后,compare 函数在第一个数字大于第二个数字时返回 true,因此 sort() 函数将元素按降序从大到小排列。最后一个循环打印排序后的向量:8 6 5 2 1。

排序向量的不同方法

在 C++ 中,有几种方法可以用来对向量进行排序。其中一些如下:

1) 使用 stable_sort()

在 C++ 中,stable_sort() 函数的工作方式与 sort() 函数类似,但唯一的区别是 stable_sort() 在元素相等时会保留它们的顺序。

语法

它具有以下语法:

使用 stable_sort() 函数对 C++ 向量进行排序的示例

让我们看一个示例来说明如何在 C++ 中使用 stable_sort() 函数对向量进行排序。

示例

编译并运行

输出

Alice (25)
Michael (25)
John (30)
shyam (30)

说明

在此示例中,我们声明了一个具有 name 和 age 成员的 Person 结构,它初始化了一个 Person 实例的向量,并根据 age 按升序使用 stable_sort 对它们进行排序。由于 stable_sort 保留了相等元素的相对顺序,因此具有相同年龄的用户将保留其初始顺序。

2) 使用 Multiset

在 C++ 中,multiset 是一个有序容器,它以提供的排序顺序存储数据。还可以通过将向量的所有元素首先推入 multiset,然后逐个放回向量来对向量进行排序。

语法

它具有以下语法:

使用 Multiset 对 C++ 向量进行排序的示例

让我们看一个示例来说明如何使用 C++ 中的 multiset 函数对向量进行排序。

示例

编译并运行

输出

10 25 25 30 30 40 50

说明

在此示例中,我们演示了如何使用 multiset 对向量进行排序。首先,我们有一个 vector<int> vec,其中包含带有重复项的未排序元素。通过将其元素插入 multiset,它们会自动按升序排列,同时保留重复项。之后,使用 assign() 将排序后的元素复制回向量,最后打印出来。

3) 使用冒泡排序算法

在 C++ 中,冒泡排序是一种简单的排序算法,如果连续元素位置不正确,它会不断地交换它们。之后,循环继续,直到向量被排序。

使用冒泡排序算法对 C++ 向量进行排序的示例

让我们看一个示例来说明如何在 C++ 中使用冒泡排序算法对向量进行排序。

示例

编译并运行

输出

11 12 22 25 64

说明

在此示例中,我们使用冒泡排序技术对数组进行排序。它不断检查相邻元素,如果它们不在正确的位置,则交换它们。排序后,数组按升序显示。

4) 使用自定义比较器

在 C++ 中,我们可能需要根据某些条件对项目进行排序,例如按反向顺序排序或对对象进行排序。我们可以通过向 std::sort 函数提供自定义比较器函数来实现这一点。

使用自定义比较器对 C++ 向量进行排序的示例

让我们看一个示例来说明如何在 C++ 中使用自定义比较器对向量进行排序。

示例

编译并运行

输出

9 6 5 5 2 1

说明

在此示例中,我们借助自定义比较器函数 customCompare 以降序对向量进行排序,该函数比较两个元素,如果第一个大于第二个则返回 true。之后,std::sort 函数使用此比较器对元素进行排序,然后打印排序后的向量。

5) 使用 Lambda 表达式

在 C++ 中,lambda 表达式还提供了一种直接的方式,可以在函数调用的位置编码匿名函数,以便更轻松地将它们用于预期目的,例如自定义排序。 C++ lambda 表达式在使用 std::sort 时尤其更好,因为我们可以指定自定义排序,而无需在源代码的另一个部分定义特殊的比较器函数。

使用 Lambda 表达式对 C++ 向量进行排序的示例

让我们举一个例子来说明如何在 C++ 中使用 Lambda 表达式对向量进行排序。

示例

编译并运行

输出

9 6 4 3 1

说明

在此示例中,我们创建了一个带有整数的向量 v。之后,它使用 sort 和 lambda 表达式对向量进行降序排序,如果第一个元素大于第二个则返回 true。排序后,它按顺序打印出向量的所有元素。

6) 使用 partial_sort

在 C++ 中,如果我们需要对向量的一部分进行排序,例如最小或最大的项,partial_sort 函数就很有用。它部分地对前 n 个元素进行排序,而将向量的其余部分保留在某种未定义的顺序中。

使用 partial_sort() 函数对 C++ 向量进行排序的示例

让我们举一个例子来说明如何在 C++ 中使用 partial_sort() 函数对向量进行排序。

示例

编译并运行

输出

2 3 4 9 7 8

说明

在此示例中,我们使用 partial_sort 函数对向量 v 的前三个最小元素进行部分排序。之后,它将这些元素按升序放在向量的开头,其余元素保持无序。

结论

总之,对向量进行排序是一项基本技能,因为它能够以信息丰富的方式组织数据。各种排序算法,如 sort、stable_sort、自定义比较器、lambda 甚至部分排序,都根据程序需求具有高度的灵活性。

C++ 排序向量选择题

1) 以下哪个函数用于在 C++ 中对向量进行排序?

  1. std::reverse
  2. std::sort
  3. std::shuffle
  4. std::rotate
 

答案: b) std::sort


2) 以下哪种排序方法在 C++ 中会保留相等元素的顺序?

  1. std::sort
  2. std::partial_sort
  3. std::stable_sort
  4. std::multiset
 

答案: c) std::stable_sort


3) 以下关于 C++ lambda 用于排序的特性是什么?

  1. 它们总是比自定义比较器慢。
  2. 它们允许在原地进行排序,而无需单独的函数。
  3. 它们无法捕获外部作用域的变量。
  4. 它们仅适用于 set。
 

答案: b) 它们允许在原地进行排序,而无需单独的函数。


4) C++ 中的 partial_sort 函数执行什么操作?

  1. 对整个向量进行排序
  2. 对向量的前 n 个元素进行排序,并使其余元素无序
  3. 对向量进行降序排序
  4. 部分反转向量
 

答案: b) 对向量的前 n 个元素进行排序,并使其余元素无序


5) 当我们在 C++ 中使用 multiset 存储元素时会发生什么?

  1. 它以任何顺序存储元素
  2. 它会自动按升序对元素进行排序
  3. 它会删除重复的元素
  4. 它只存储唯一的元素
 

答案: b) 它会自动按升序对元素进行排序