sort函数
文章目录
1.sort 函数简介
顾名思义,sort()就是用来排序的函数,它根据具体情况使用不同的排序方法,效率较高。一般来说,不推荐使用C语言中的qsort函数,原因是qsort用起来比较繁琐,涉及很多指针的操作。而且sort在实现中避免了经典快速排序中可能出现的会导致实际复杂度退化到O(n2)的极端情况。
2.sort 使用
(1)需要的头文件
#include<algorithm>
(2) 命名空间
sort(首元素地址(必填), 尾元素地址的下一个地址(必填), 比较函数(非必填));
a. 默认(升序)
void sort (RandomAccessIterator first, RandomAccessIterator last);
b. 自定义
void sort (RandomAccessIterator first, RandomAccessIterator last, Compare comp);
3.sort原理
sort()并非只是普通的快速排序,除了对普通的快速排序进行优化,它还结合了插入排序和堆排序。根据不同的数量级别以及不同情况,能自动选用合适的排序方法。当数据量较大时采用快速排序,分段递归。一旦分段后的数据量小于某个阀值,为避免递归调用带来过大的额外负荷,便会改用插入排序。而如果递归层次过深,有出现最坏情况的倾向,还会改用堆排序。所以无论元素初始时为何种状态,sort()的平均排序复杂度为均为O(N*log2(N)) ,具有不错的的性能,在刷算法题时,可以直接使用sort()来对数据进行排序,而不需手动编写排序函数。
4.实战
(1)对数组进行排序
#数组不仅可以是int类型,还可以是double,char
#可以指定对中间元素进行排序
#希望从小到大排序,可以使用greater()
greater表示“跟大”的意思,表示待排序的数组元素类型为int,整个代码表示让一个元素类型为整数的数组从大到小排序
#include<iostream>
#include<algorithm>
using namespace std;
int main() {
int arr[] = { 2,4,7,1,3 };
//=============排序从小到大======
sort(arr, arr + 5);
for (int i = 0; i < 5; i++)
cout << arr[i] << " ";
cout << endl;
//=============从大到小======
sort(arr, arr + 5, greater<int>());
for (int i = 0; i < 5; i++)
cout << arr[i] << " ";
cout << endl;
//=============排序中间元素======
sort(arr + 1, arr + 4);
for (int i = 0; i < 5; i++)
cout << arr[i] << " ";
cout << endl;
return 0;
}
#同样,也可以自己实现比较函数,函数的返回值为bool类型
#include<iostream>
#include<algorithm>
using namespace std;
bool cmp(int x, int y){//可简单理解为 > 降序排列; < 升序排列
return x > y;
}
int main() {
int arr[] = { 2,4,7,1,3,5,9,6,8,10};
sort(arr, arr + 10, cmp);
for (int i = 0; i < 10; i++)
cout << arr[i] << " ";
cout << endl;
return 0;
}
(2)结构体排序
#要对元素进行排序,前提是元素之间可以进行比较,即谁大谁小。 基本数据类型可直接进行大小比较, 但结构体元素之间的大小关系需要我们自己指定,如果不指定,则结构体之间大小关系就不确定,则不能够排序。
要求:
对一个班级内的学生成绩进行排序,首先按成绩进行排序降序排列,若成绩相同,则按照姓名字典顺序升序排列。
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
struct Student { // 学生结构体
string name; // 学生姓名
int grade; // 学生分数
Student(); // 无参数构造函数
Student(string name, int grade) : name(name), grade(grade) {}; // 有参数构造函数
};
bool cmp(Student s1, Student s2) { // 自定义排序(二级排序)
if (s1.grade != s2.grade) { // 如果学生成绩不同
return s1.grade > s2.grade; // 则按照成绩降序排列
}
return s1.name < s2.name; // 否则按照姓名升序排列
}
int main() {
vector<Student> studs;
studs.emplace_back("Bob", 80);
studs.emplace_back("Ali", 90);
studs.emplace_back("Ann", 85);
studs.emplace_back("Liming", 90);
studs.emplace_back("Trump", 79);
studs.emplace_back("Fury", 58);
studs.emplace_back("Jam", 62);
studs.emplace_back("Lucy", 89);
sort(studs.begin(), studs.end(), cmp); // 排序
for (int i = 0; i < studs.size(); i++) { // 输出结果
cout << studs[i].name << "\t" << studs[i].grade << endl;
}
return 0;
}
运行结果:
nt i = 0; i < studs.size(); i++) { // 输出结果
cout << studs[i].name << “\t” << studs[i].grade << endl;
}
return 0;
}
运行结果:
<img src="E:\笔记\c++笔记\cpp.picture\sort实验结果.png" style="zoom: 80%;" />