一、qsort函数
1.1函数介绍
原型:_CRTIMP void __cdecl qsort(void*, size_t, int()(const void, const void*));
参数:第一个参数为待排序数组首地址;第二个参数为数组元素个数;第三个参数为每个元素所占空间;第四个参数为函数指针,用于指定排序的规则。
说明:qsort函数由ANSI C标准中提供,其声明在stdlib.h文件中,是根据二分法写的,时间复杂度为O(nlogn)。
使用:qsort要求提供比较函数用来确定排序的顺序(升序、降序),比较函数使得qsort通用性更好,可以对数组、字符串、结构体数组进行排序。如int cmp(const void *a, const void *b)中有两个元素作为参数(参数的格式不能变的。)返回一个int值,如果比较函数返回大于0,qsort就认为a > b,返回小于0,qsort就认为a < b。
1.2排序示例
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct Student{ //结构体类型
char name[10];
char id[10];
}STU;
//比较函数
int cmp(const void* a, const void* b) {
STU* aStu = (STU*)(a);
STU* bStu = (STU*)(b);
return strcmp(aStu->id, bStu->id);
}
void main() {
int i;
STU stus[5] = {{"zhangsan", "2020004"}, {"lisi","2020002"},
{"wangwu", "2020001"}, {"zhaoliu", "2020011"}, {"qianqi", "2020008"}};
qsort(stus, 5, sizeof(STU), cmp); //函数调用
for(i = 0; i < 5; i++) {
printf("%s %s\n", stus[i].id, stus[i].name);
}
printf("\n");
}
排序结果如下所示。
2020001 wangwu
2020002 lisi
2020004 zhangsan
2020008 qianqi
2020011 zhaoliu
二、sort函数
2.1函数介绍
C++中的sort函数原型有两种形式:
1)默认类型
template <class RandomAccessIterator>
void sort (RandomAccessIterator first, RandomAccessIterator last);
2)带比较函数类型
template <class RandomAccessIterator, class Compare>
void sort (RandomAccessIterator first, RandomAccessIterator last, Compare comp);
Compare函数类对元素进行比较、实现自定义排序;有以下三种方式来实现Compare类。
1)元素自身包含了比较关系,如int,double等基础类型,可以直接进行比较,greater() 递减, less() 递增,用伪函数可以实现;
2)元素本身为class或者struct,类内部需要重载< 运算符,实现元素的比较;
3)类外实现,用bool cmp (EleType a1,EleType a2) 或者 bool cmp(const EleType & a1, const EleType & a2) 。
2.2排序示例
#include <string>
#include <algorithm> //sort函数头文件
#include <iostream>
using namespace std;
bool cmp(const string &a, const string &b) {
return a > b;
}
int _tmain(int argc, _TCHAR* argv[])
{
string info1[] = {"001", "007", "008", "002", "001"};
string info2[] = {"001", "007", "008", "002", "001"};
sort(info1, info1+5, cmp);
sort(info2, info2+5, less<string>());
cout<<"info1:";
for(int i = 0; i < 5; i++) {
cout<<info1[i]<<" ";
}
cout<<endl;
cout<<"info2:";
for(int i = 0; i < 5; i++) {
cout<<info2[i]<<" ";
}
cout<<endl;
system("pause");
return 0;
}
排序结果如下所示。
info1:008 007 002 001 001 //降序
info2:001 001 002 007 008 //升序
三、sort与qsort比较
二者的比较函数返回值类型不同,sort函数的比较函数返回bool型,而qsort返回int型;sort函数是c++中标准模板库的的函数,在qsort()上已经进行了优化,根据情况的不同可以采用不同的算法,所以较快。在同样的元素较多和同样的比较条件下,sort()的执行速度都比qsort()要快。另外,sort()是类属函数,可以用于比较任何容器,任何元素,任何条件。