排序函数
排序函数实际上可以被分成两个部分:
- 比较大小
- 排序算法
C语言提供的qsort函数
qsort函数位于头文件<stdlib.h>或<cstdlib>中,其基本形式如下:
void qsort(s,n,sizeof(s[0]),&cmp);
其参数列表解释如下所示:
- 第一个参数s是参与排序的数组名,或者开始排序的地址
- 第二个参数是参与排序的元素个数
- 第三个参数是每个元素的大小
- 第四个函数是一个比较函数cmp的指针
cmp函数的定义形式如下所示:
int cmp(const void* a,const void* b)
- cmp函数的返回值类型必须是int,两个参数的类型必须都是const void*,a和b是两个参数。
- 假设要对int进行排序,如果是升序,就是若a>b 返回一个正值,小则负值,相等则返回0。
典型的cmp函数如下所示:
int cmp(const void* a,const void* b)
{
return(*(int*)a - *(int*)b);//升序
return(*(int*)b - *(int*)a);//降序
}
qsort函数的使用麻烦,对于cmp函数的定义很麻烦。
C++标准库中提供的std::sort
std::sort位于头文件<algorithm>中
- 举例:假设已经定义了C风格的cmp函数,可以这样实现对一个数组的排序:
int a[] = {2,4,5,3,1};
qsort(
a,
sizeof(a),
sizeof(*a)
&compare
);
而使用std::sort则如下图所示:
#include <cstdio>
#include <cmath>
#include <vector>
#include <algorithm>
using namespace std;
int main() {
vector<int> a = {2,4,5,3,1};
sort(
begin(a),
end(a),
[](int x,int y) {return x>=y;}
);
}
一般std::sort可以有两个或者三个参数;前两个参数分别为排序的起点和排序的终点,而第三个函数则是可选的比较函数。
可以根据需要选择使用一个比较函数,也可以不使用———如果不定义的话,std::sort默认会进行升序排列。
- std::sort具有以下特点:
- 比较函数返回true,false来表示两个
元素的位置是否正确。 - 可以根据类型来推导各项长度信息
- 不仅支持基本的数组,还支持STL提供的容器,比如上述代码中使用的vector
- 比较函数形式灵活,可以使用之前提到的lambda表达式让代码更紧凑。
- 比较函数返回true,false来表示两个
本文介绍了C语言的qsort函数和C++的std::sort函数。qsort函数需要提供一个比较函数,而std::sort则更加便捷,可以直接使用,并且支持STL容器及lambda表达式进行排序。std::sort默认进行升序排列,可以通过自定义比较函数实现降序或其他排序需求。
11万+

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



