前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >C qsort 与 C++ sort 函数

C qsort 与 C++ sort 函数

作者头像
恋喵大鲤鱼
发布2024-03-20 15:09:24
780
发布2024-03-20 15:09:24
举报
文章被收录于专栏:C/C++基础C/C++基础
C++ 有两个常用的排序函数:sort 与 qsort。下面介绍二者用法与区别。

1.qsort

qsort 是 C 标准库函数,申明于头文件 <stdlib.h>,基于快速排序实现。

函数原型如下:

代码语言:javascript
复制
void qsort (void* base, size_t num, size_t size, int (*compar)(const void*, const void*));

base 待排序数组首地址。

num 数组中待排序元素数量。

size 各元素的占用空间大小。

compar 指向函数的指针,根据返回值确定排序的顺序 。

返回值

含义

<0

p1 指向的元素位于 p2 指向的元素之前

0

p1指向的元素和p2指向的元素相等

>0

p1 指向的元素位于 p2 指向的元素之后

使用示例:

代码语言:javascript
复制
#include <stdio.h>      /* printf */
#include <stdlib.h>     /* qsort */

int values[] = { 40, 10, 100, 90, 20, 25 };

int compare(const void* a, const void* b) {
	return (*(int*)a - *(int*)b);
}

int main() {
	qsort(values, 6, sizeof(int), compare);
	for (int i = 0; i < 6; i++){
		printf("%d ", values[i]);
	}
	return 0;
}

运行输出:

代码语言:javascript
复制
10 20 25 40 90 100

2.sort

sort 是 C++ 标准模板库(STL)中的函数模板,定义于头文件<algorithm>,所在名字空间为 std。

将范围 [first,last) 中的元素按升序排序。

第一个版本使用 operator< 来比较元素,第二个版本使用 comp 来比较元素。

不保证等效元素保持其原始相对顺序(请参阅 stable_sort )。

函数原型:

代码语言:javascript
复制
template <class RandomAccessIterator>  void sort (RandomAccessIterator first, RandomAccessIterator last);

template <class RandomAccessIterator, class Compare>  void sort (RandomAccessIterator first, RandomAccessIterator last, Compare comp);

first, last 用于指定待排序元素下标,不包含 last。

comp(可选)为接受范围内的两个元素作为参数,并返回可转换为 bool 的值的二元函数。返回 true 表示第一个参数排在第二个参数之前。

使用示例:

代码语言:javascript
复制
#include <stdio.h>      /* printf */
#include <algorithm>    /* sort */

int values[] = { 40, 10, 100, 90, 20, 25 };

int main() {
	std::sort(values, values + 6);
	for (int i = 0; i < 6; i++){
		printf("%d ", values[i]);
	}
	return 0;
}

运行输出:

代码语言:javascript
复制
10 20 25 40 90 100

3.区别

qsort 和 sort 都是标准库函数,都可用于排序,但是二者也存在着一些区别:

  • 性质不同。

qsort 是 C 的库函数,sort 是 C++ STL 中的函数模板。

  • sort 更易于使用。

qsort 必须要指定比较函数,而 sort 可以指定,也可以缺省。

  • sort 速度更快。

sort 比 qsort 更快,因为 C++ 的模板为特定数据类型和特定比较函数生成优化的代码。sort 速度比手动编写的快速排序快 20% 到 50%,比 qsort 快 250% 到 1000%。C 可能是最快的语言,但 qsort 非常慢。

由于内联,C++ sort() 在同等数据上比 qsort() 快得多。默认情况下,整数容器上的 sort() 将被编译为使用 std::less::operator() ,它将被内联,并且 sort() 将直接比较整数。 而 qsort() 通过函数指针进行间接调用比较元素大小,导致编译器无法优化。

  • sort 灵活性更高。

sort 适用于所有数据类型和不同的数据容器,例如 C 数组、C++ 向量、C++ 双端队列等以及用户可以编写的其他容器。 这种灵活性在 C 语言中很难实现。

  • sort 安全性更高。

与 qsort 相比,模板化排序更加类型安全,因为它不需要像 qsort 那样通过不安全的 void 指针访问数据项。

综上所述,优先使用 sort

参考文献

qsort - cplusplus.com sort - cplusplus.com C qsort() vs C++ sort()

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2024-03-19,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • C++ 有两个常用的排序函数:sort 与 qsort。下面介绍二者用法与区别。
  • 1.qsort
  • 2.sort
  • 3.区别
  • 参考文献
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档