C++之sort()函数详解,刷题必备~

这篇具有很好参考价值的文章主要介绍了C++之sort()函数详解,刷题必备~。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

        顾名思义,sort就是用来排序的函数,它根据具体情形使用不同的排序方法,效率较高。一般来说,不推荐使用C语言中的qsort函数,原因是qsort用起来比较烦琐,涉及很多指针的操作。而且sort在实现中规避了经典快速排序中可能出现的会导致实际复杂度退化到(o(n)的极端情况。希望读者能通过这篇介绍来轻松愉快地使用sort函数。
1.如何使用sort排序
        sort函数的使用必须加上头文件“#include<algorithm>”和“using namespace std;”,其使用的方式如下:
        sort(首元素地址(必填),尾元素地址的下一个地址(必填),比较函数(非必填));
可以看到,sort的参数有三个,其中前两个是必填的,而比较函数则可以根据需要填写,如果不写比较函数,则默认对前面给出的区间进行递增排序。

#include <stdio.h>
#include <algorithm>
using namespace std;
int main(){
int a[6] = {9,4,2,5,6,-1};
sort(a,a+4);
//a[0]~a[3]从小到大排序
for(int i=0;i<6;i++){
    printf("%d",a[i]);
}
printf("\n");
//a[0]~a[5]从小到大排序
sort(a,a+6);
for(int i=0;i<6;i++){
	printf("%d",a[i]);
 }
	return 0;
}

        运行之后可以得到下面的结果,可以试着理解一下(特别注意理解“尾元素地址的下一个地址”)。输出结果:

24596-1
-124569

 又如,对double型数组排序:

#include <stdio.h>
#include <algorithm>
using namespace std;
int main(){
	double a[] = {1.1,-1.1,99};
	sort(a,a+3);
	for(int i=0;i<3;i++){
		printf("%.1f",a[i]);
	}
	return 0;

}

 输出结果:

-1.1 1.1 99.0

再如,对char数组排序(默认为字典序) 

#include <stdio.h>
#include <algorithm>
using namespace std;
int main(){
	char c[]={'I','L','O','V','E','U'};
	sort(c,c+6);
	for(int i=0;i<6;i++){
		printf("%c",c[i]);
	}
	return 0;
}

 输出结果:

EILOUV

 2.如何实现比较函数cmp

        下面介绍对于基本数据类型、结构体类型、STL容器进行自定义排序cmp的写法。

        2.1基本数据类型数组的排序

若比较函数不填,默认升序排序 ,下面为对int数组的排序:

#include <stdio.h>
#include <algorithm>
using namespace std;
int main(){
	int a[5] = {3,5,2,1,4};
	sort(a,a+5);
	for(int i=0;i<5;i++){
		printf("%d",a[i]);
	}
	return 0;
}

  输出结果:

12345

 如果想要降序排列,则需要使用cmp函数“告诉”sort何时交换元素,可以这样写:

#include <stdio.h>
#include <algorithm>
using namespace std;
bool cmp(int a,int b){
	return a>b;
	//可以理解为a>b时,把a放在前面 
}
int main(){
	int a[5] = {3,5,2,1,4};
	sort(a,a+5,cmp);
	for(int i=0;i<5;i++){
		printf("%d",a[i]);
	}
	return 0;
}

  输出结果:

54321

        这样就可以让数值大的元素在前面,即降序排列,对于double,char亦如此,把cmp内传入参数的类型改变一下就好了。

        2.2结构体数组的排序

        现在定义了如下结构体:

struct node{
    int x,y;
}ssd[10];

如果想让ssd数组按照x从大到小排列,可以这样写cmp函数:

bool cmp(node a, node b){
    return a.x > b.x;
}

示例如下:

#include <stdio.h>
#include <algorithm>
using namespace std;
struct node{
    int x,y;
}ssd[10];
bool cmp(node a, node b){
    return a.x > b.x; //按照x降序排列 
}
int main(){
	ssd[0].x=2; //{2,2} 
	ssd[0].y=2;
	ssd[1].x=1; //{1,3}
	ssd[1].y=3;
	ssd[2].x=3; //{3,1}
	ssd[2].y=1;
	sort(ssd,ssd+3,cmp);
	for(int i=0;i<3;i++){
		printf("%d %d\n",ssd[i].x,ssd[i].y);
	}
	return 0;
}

 输出结果:

3 1
2 2
1 3

 如果想先按照x降序,x相等时,y升序排列(二级排序),那么:

#include <stdio.h>
#include <algorithm>
using namespace std;
struct node{
    int x,y;
}ssd[10];
bool cmp(node a, node b){
    if(a.x!=b.x) return a.x>b.x;
	else return a.y < b.y; //按照x降序排列 
}
int main(){
	ssd[0].x=2; //{2,2} 
	ssd[0].y=2;
	ssd[1].x=1; //{1,3}
	ssd[1].y=3;
	ssd[2].x=2; //{2,1}
	ssd[2].y=1;
	sort(ssd,ssd+3,cmp);
	for(int i=0;i<3;i++){
		printf("%d %d\n",ssd[i].x,ssd[i].y);
	}
	return 0;
}

 输出结果:

2 1
2 2
1 3

         2.3容器的排序

        在STL标准容器中,只有vector、string、deque可以使用sort。这是因为像set,map这种容器是用红黑树实现的,元素本身有序,因此不允许使用sort排序。

下面以vector为例:

#include <stdio.h>
#include <vector>
#include <algorithm>
using namespace std;
bool cmp(int a,int b){
	return a>b;
}

int main(){
	vector<int> vi;
	vi.push_back(3);
	vi.push_back(1);
	vi.push_back(2);
	sort(vi.begin(),vi.end(),cmp); //整个排序
	for(int i=0;i<3;i++){
		printf("%d ",vi[i]);
	} 
	return 0;
}

 输出结果:文章来源地址https://www.toymoban.com/news/detail-551446.html

3 2 1

到了这里,关于C++之sort()函数详解,刷题必备~的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • C++ STL sort函数的底层实现

    sort函数 的底层用到的是 内省式排序 以及 插入排序 ,内省排序首先从快速排序开始,当递归深度超过一定深度(深度为排序元素数量的对数值)后转为堆排序。 先来回顾一下以上提到的3中排序方法: 快速排序:先选一个基准值(一般为首值),将比它大的数置于其右侧,

    2024年02月15日
    浏览(40)
  • Python 列表 sort()函数使用详解

    「作者主页」: 士别三日wyx 「作者简介」: CSDN top100、阿里云博客专家、华为云享专家、网络安全领域优质创作者 「推荐专栏」: 小白零基础《Python入门到精通》 sort() 可以对列表进行 「排序」 语法 参数 key :(可选)指定排序规则 reverse :(可选)升序降序 返回值 返回

    2024年02月13日
    浏览(37)
  • C++ sort()函数和priority_queue容器中比较函数的区别

    普通的queue是一种先进先出的数据结构,元素在队列尾追加,而从队列头删除。 priority_queue中元素被赋予优先级。在创建的时候根据优先级进行了按照从大到小或者从小到大进行了自动排列(大顶堆or小顶堆)。可以以O(log n) 的效率查找一个队列中的最大值或者最小值; 虽然两

    2023年04月09日
    浏览(44)
  • C++(15): STL算法:排序(sort)

            std::sort 是 C++ 标准库 algorithm 中提供的一个函数,用于对容器(如数组、向量等)中的元素进行排序。它基于比较操作对元素进行排序,通常使用高效的排序算法,如快速排序、归并排序或堆排序等。         在实际应用中,std::sort 通常会根据输入数据的大

    2024年04月12日
    浏览(34)
  • 【C++】iota函数 + sort函数实现基于一个数组的多数组对应下标绑定排序

    目录 一、iota函数 1. 函数解析 ​①  迭代器类型(补充) ② 头文件 ③  参数 2. 函数用途与实例 二、sort函数 1、 函数解读 2、实现倒序排列 2.1 greater 与 less 模板参数 2.2  lambda表达式 三、下标绑定排序(zip) --- 833.字符串中的查找与替换 ①  迭代器类型(补充) ForwardIterator :

    2024年02月12日
    浏览(56)
  • 【算法】桶排序(Bucket Sort)详解

    桶排序(Bucket Sort)又称箱排序,是一种比较常用的排序算法。其算法原理是将数组分到有限数量的桶里,再对每个桶分别排好序(可以是递归使用桶排序,也可以是使用其他排序算法将每个桶分别排好序),最后一次将每个桶中排好序的数输出。 桶排序的思想就是把待排序

    2024年01月24日
    浏览(43)
  • 【目标跟踪算法】Strong SORT多目标跟踪模型论文解析+代码详解

    1. Strong SORT算法的背景和概述 Strong SORT算法基于经典的Deep SORT模型,并从目标检测模型、表征特征模型和匹配算法等各个方面对其进行了升级优化。 1.1 表观特征分支的优化算法 对于Strong SORT算法的表观特征分支部分,主要是进行了2方面的优化,一是优化了特征提取器的能力

    2024年02月12日
    浏览(36)
  • [排序算法]:归并排序(Merge Sort)(递归与非递归实现详解)

            归并排序,是创建在归并操作上的一种有效的排序算法。算法是采用分治法(Divide and Conquer)的一个非常典型的应用,且各层分治递归可以同时进行。归并排序思路简单,速度仅次于快速排序,为稳定排序算法,一般用于对总体无序,但是各子项相对有序的数列。

    2024年01月20日
    浏览(44)
  • Java字符串常用函数 详解5000字 (刷题向 / 应用向)

    直接定义字符串是指使用双引号表示字符串中的内容,例如\\\"Hello Java\\\"、\\\"Java 编程\\\"等。具体方法是用字符串常量直接初始化一个 String 对象,示例如下: 1.    String str=\\\"Hello Java\\\"; 或者 1.    String str; 2.    str=\\\"Hello Java\\\"; 注意:字符串变量必须经过初始化才能使用。 String str2

    2024年02月05日
    浏览(42)
  • OJ刷题---[算法课动态规划]走网格(C++完整代码)

    m行n列的网格,从左上角(1,1)出发,每一步只能向下或者向右,问共有多少种方法可以走到右下角(m,n); 输入参数 m n (1=m=10 1=n=10) 输出多少种走法 比如: 输入:2 3 输出:3 输入:5 5 输出:70 完整代码(C++): 结果: 注意:最后调用的时候,是调用sum(m,n),而不是sum(m+1

    2024年02月07日
    浏览(39)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包