排序(Sort)
一、基本使用
- 功能与默认排序方式
sort函数用于对数组进行排序,默认情况下是按照从小到大的顺序对数组元素进行排序。- 例如,要对数组
a的前n个元素进行排序,可使用sort(a,a+n)。这里a表示要排序的数组(实际相当于a+0,即从数组首地址开始),a + n表示从数组a开始选取连续的n个元素进行排序。 - 实例:
#include <iostream>
#include <algorithm>
int main() {
int a[] = {5, 2, 8, 1, 9};
int n = sizeof(a) / sizeof(a[0]);
sort(a, a + n);
for (int i = 0; i < n; i++) {
std::cout << a[i] << " ";
}
return 0;
}
- 上述代码中,定义了一个包含5个元素的数组
a,然后使用sort函数对整个数组进行排序,最后输出排序后的数组元素,结果为1 2 5 8 9,实现了从小到大排序。
- 头文件
- 使用
sort函数需要包含<algorithm>头文件。
- 使用
二、不同排序顺序的实现
- 从小到大排序(默认)
- 直接使用
sort(a,a+n)即可实现对数组a的前n个元素从小到大排序。(实例见上)
- 直接使用
- 从大到小排序
- 可以通过在
sort函数中添加第三个参数greater<T>()来实现从大到小排序,其中T是数组的数据类型。例如sort(a,a+n,greater<int>())可以对int类型的数组a进行从大到小排序。 - 实例:
- 可以通过在
#include <iostream>
#include <algorithm>
int main() {
int a[] = {5, 2, 8, 1, 9};
int n = sizeof(a) / sizeof(a[0]);
sort(a, a + n, greater<int>());
for (int i = 0; i < n; i++) {
std::cout << a[i] << " ";
}
return 0;
}
- 此代码与上面从小到大排序的代码类似,只是在
sort函数中添加了greater<int>()参数,输出结果为9 8 5 2 1,实现了从大到小排序。
三、自定义排序规则
sort函数的自定义形式- 当需要按照特定规则进行排序时,可以使用
sort(数组名+begin,数组名+end,cmp)的形式,其中begin和end指定了要排序的数组范围(类似a和a + n的作用),cmp是自定义的排序规则函数。
- 当需要按照特定规则进行排序时,可以使用
cmp函数的定义与作用cmp函数返回值为布尔类型。如果返回结果为假,函数会将比较的两个元素互换位置;如果返回结果为真,则保持原来位置不变。- 例如,要实现从大到小排序,
cmp函数可以定义为return x>y;要实现从小到大排序,cmp函数可以定义为return x<y。
- 复杂自定义排序规则示例分析
- 假设有如下排序规则要求:先判断奇数在前,偶数在后,满足此规则返回
true;其次在判断同为偶数或者奇数时,按照从小到大排序,否则其他情况返回false。以下是实现该排序规则的cmp函数示例:
- 假设有如下排序规则要求:先判断奇数在前,偶数在后,满足此规则返回
bool cmp(int x, int y) {
if (x % 2!= 0 && y % 2 == 0) {
return true; // 奇数在前,偶数在后
} else if (x % 2 == 0 && y % 2!= 0) {
return false; // 不符合奇数在前,偶数在后,交换位置
} else {
return x < y; // 同为偶数或奇数时,从小到大排序
}
}
- 分析:
- 首先判断
x为奇数且y为偶数时,满足奇数在前偶数在后的规则,返回true,保持x和y的位置不变。 - 当
x为偶数且y为奇数时,不满足规则,返回false,此时sort函数会交换x和y的位置。 - 如果
x和y同为奇数或同为偶数,按照从小到大的顺序进行比较,返回x < y的结果,sort函数根据这个结果决定是否交换x和y的位置,从而实现整体按照奇数在前偶数在后,且各自内部从小到大排序的规则。
- 首先判断
- 实例:
#include <iostream>
#include <algorithm>
bool cmp(int x, int y) {
if (x % 2!= 0 && y % 2 == 0) {
return true;
} else if (x % 2 == 0 && y % 2!= 0) {
return false;
} else {
return x < y;
}
}
int main() {
int a[] = {3, 4, 1, 6, 7, 2};
int n = sizeof(a) / sizeof(a[0]);
sort(a, a + n, cmp);
for (int i = 0; i < n; i++) {
std::cout << a[i] << " ";
}
return 0;
}
- 在这个实例中,定义了数组
a,然后使用自定义的cmp函数结合sort函数对数组进行排序。输出结果为1 3 7 2 4 6,先将奇数1、3、7排在前面且从小到大排序,然后将偶数2、4、6排在后面且从小到大排序。
使用sort函数结合自定义排序规则的一般步骤如下:
- 定义数组,并使用循环输入数组元素。
- 按照需求撰写
cmp规则函数。 - 使用
sort函数结合自定义的cmp函数对数组进行排序。 - 输出排序后的数组元素。
1032

被折叠的 条评论
为什么被折叠?



