下面将详细介绍如何使用 C++ 的 std::sort 函数实现数组或容器元素从小到大和从大到小的排序,同时还会给出不同数据类型(如基本数据类型、自定义数据类型)的排序示例。
对基本数据类型(如 int)进行排序1. 从小到大排序#include
#include
#include
int main() {
// 定义一个整数向量
std::vector
// 使用 std::sort 进行从小到大排序
std::sort(numbers.begin(), numbers.end());
// 输出排序后的结果
std::cout << "从小到大排序结果: ";
for (int num : numbers) {
std::cout << num << " ";
}
std::cout << std::endl;
return 0;
}
代码解释:
std::sort(numbers.begin(), numbers.end()); 这行代码调用了 std::sort 函数,它会对 numbers 向量中从 begin() 到 end() 范围内的元素进行排序。由于没有提供自定义比较函数,默认是按照从小到大的顺序排序。2. 从大到小排序#include
#include
#include
// 自定义比较函数,用于从大到小排序
bool compareDesc(int a, int b) {
return a > b;
}
int main() {
std::vector
// 使用 std::sort 并传入自定义比较函数进行从大到小排序
std::sort(numbers.begin(), numbers.end(), compareDesc);
std::cout << "从大到小排序结果: ";
for (int num : numbers) {
std::cout << num << " ";
}
std::cout << std::endl;
return 0;
}
代码解释:
compareDesc 函数是自定义的比较函数,它接受两个 int 类型的参数 a 和 b,当 a > b 时返回 true(真则不交换),表示 a 应该排在 b 前面,从而实现从大到小的排序。std::sort(numbers.begin(), numbers.end(), compareDesc); 调用 std::sort 函数时传入了自定义比较函数 compareDesc,使得排序按照从大到小的规则进行。对自定义数据类型进行排序1. 自定义类型的定义假设我们有一个 Student 类,包含学生的姓名和成绩,我们要根据成绩对学生进行排序。
#include
#include
#include
#include
// 定义 Student 类
class Student {
public:
std::string name;
int score;
Student(const std::string& n, int s) : name(n), score(s) {}
};
2. 从小到大排序// 自定义比较函数,按成绩从小到大排序
bool compareScoreAsc(const Student& s1, const Student& s2) {
return s1.score < s2.score;
}
int main() {
std::vector
{"Alice", 85},
{"Bob", 70},
{"Charlie", 90}
};
// 按成绩从小到大排序
std::sort(students.begin(), students.end(), compareScoreAsc);
std::cout << "按成绩从小到大排序结果:" << std::endl;
for (const auto& student : students) {
std::cout << student.name << ": " << student.score << std::endl;
}
return 0;
}
代码解释:
compareScoreAsc 函数用于比较两个 Student 对象的成绩,当 s1.score < s2.score 时返回 true,表示 s1 应该排在 s2 前面,实现按成绩从小到大排序。std::sort(students.begin(), students.end(), compareScoreAsc); 调用 std::sort 函数并传入自定义比较函数 compareScoreAsc 对 students 向量进行排序。3. 从大到小排序// 自定义比较函数,按成绩从大到小排序
bool compareScoreDesc(const Student& s1, const Student& s2) {
return s1.score > s2.score;
}
int main() {
std::vector
{"Alice", 85},
{"Bob", 70},
{"Charlie", 90}
};
// 按成绩从大到小排序
std::sort(students.begin(), students.end(), compareScoreDesc);
std::cout << "按成绩从大到小排序结果:" << std::endl;
for (const auto& student : students) {
std::cout << student.name << ": " << student.score << std::endl;
}
return 0;
}
代码解释:
compareScoreDesc 函数用于比较两个 Student 对象的成绩,当 s1.score > s2.score 时返回 true,表示 s1 应该排在 s2 前面,实现按成绩从大到小排序。std::sort(students.begin(), students.end(), compareScoreDesc); 调用 std::sort 函数并传入自定义比较函数 compareScoreDesc 对 students 向量进行排序。通过上述示例,你可以清晰地看到如何使用 std::sort 函数对不同数据类型进行从小到大和从大到小的排序。
补充,stable_sort std::stable_sort 是 C++ 标准库
基本语法std::stable_sort 有两种重载形式:
// 第一种形式:使用元素类型的 operator< 进行比较
template< class RandomIt >
void stable_sort( RandomIt first, RandomIt last );
// 第二种形式:使用自定义的比较函数 comp 进行比较
template< class RandomIt, class Compare >
void stable_sort( RandomIt first, RandomIt last, Compare comp );
参数说明:
first 和 last:这是随机访问迭代器,分别指向要排序的元素范围的起始位置和结束位置(不包含 last 所指向的元素)。comp:这是一个可选的比较函数,它接受两个参数,返回一个布尔值。如果返回 true,表示第一个参数应该排在第二个参数之前。复杂度分析时间复杂度:通常为 ,其中 是要排序的元素数量。不过在某些情况下,时间复杂度可以接近 。空间复杂度:通常为 ,这意味着在排序过程中,可能需要额外的与元素数量成正比的内存空间。与 std::sort 的比较稳定性:std::stable_sort 是稳定排序,即相等元素的相对顺序在排序后保持不变;而 std::sort 是不稳定排序,相等元素的相对顺序可能会改变。性能:std::sort 平均情况下的时间复杂度为 ,通常比 std::stable_sort 更快,因为它不保证稳定性,实现上可能更高效。如果不需要保证相等元素的相对顺序,使用 std::sort 通常是更好的选择。示例代码对基本数据类型排序#include
#include
#include
int main() {
std::vector
// 使用 std::stable_sort 进行排序
std::stable_sort(numbers.begin(), numbers.end());
// 输出排序后的结果
for (int num : numbers) {
std::cout << num << " ";
}
std::cout << std::endl;
return 0;
}
在这个例子中,std::stable_sort 对 numbers 向量中的元素进行升序排序,由于使用的是默认的比较方式(即 operator<),所以元素会按照从小到大的顺序排列,并且相等的元素(如两个 3)的相对顺序会保持不变。
对自定义类型排序#include
#include
#include
#include
// 自定义类型
struct Person {
std::string name;
int age;
};
// 自定义比较函数,按年龄升序排序
bool compareByAge(const Person& p1, const Person& p2) {
return p1.age < p2.age;
}
int main() {
std::vector
{"Alice", 25},
{"Bob", 20},
{"Charlie", 25}
};
// 使用 std::stable_sort 并传入自定义比较函数进行排序
std::stable_sort(people.begin(), people.end(), compareByAge);
// 输出排序后的结果
for (const auto& person : people) {
std::cout << person.name << " (" << person.age << ")" << std::endl;
}
return 0;
}
在这个例子中,定义了一个 Person 结构体,包含姓名和年龄两个成员。通过自定义比较函数 compareByAge,使用 std::stable_sort 对 people 向量按照年龄进行升序排序。由于使用的是稳定排序,年龄相同的 Alice 和 Charlie 的相对顺序会保持不变。
注意事项比较函数 comp 必须满足严格弱序关系,即对于任意的 a、b、c,需要满足:
comp(a, a) 必须为 false。如果 comp(a, b) 为 true,则 comp(b, a) 必须为 false。如果 comp(a, b) 为 true 且 comp(b, c) 为 true,则 comp(a, c) 必须为 true。传递给 std::stable_sort 的迭代器必须是随机访问迭代器,例如 std::vector、std::array 的迭代器,而像 std::list 的迭代器是双向迭代器,不能直接用于 std::stable_sort,但 std::list 有自己的 sort 成员函数可以实现排序。