C中的qsort函数和C++中的sort函数的理解与使用

一、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()是类属函数,可以用于比较任何容器,任何元素,任何条件。

发布了33 篇原创文章 · 获赞 6 · 访问量 555

猜你喜欢

转载自blog.csdn.net/weixin_43519984/article/details/104100057