C++库函数——sort函数

本文介绍了C++中sort函数的使用,强调在面对时间限制时选择高效排序算法的重要性。通过示例展示了sort函数的基本用法,包括默认从小到大排序、自定义从大到小排序以及如何对不同数据类型进行排序。调用sort函数只需包含<algorithm>头文件,是实现快速排序的有效方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

首先我们在OJ上做题的时候,题目会给出时间限制,一般来说,时间限制为1s;这就要求我们所涉及的算法时间复杂度不能超过百万级别,即不能达到一千万。如果算法时间复杂度为O(n^2),则该n不应该大于3000,否则机会达到我们所限制的千万数量级复杂度。举例来说,我们不能在1s的时间限制内对10000个整数进行冒泡排序,而必须使用快速排序等时间复杂度为O(nlog(n))的排序算法。而我们是否需要去记忆这些排序算法呢?实际上,C++已经编写了快速排序库函数,我们只需要在库函数声明#include<algorithm>就可调用排序函数——sort()函数了。

sort函数有三个参数:(sort(start,end,compare))

(1)第一个是要排序的数组的起始地址

(2)第二个是结束的地址(最后一位要排序的地址)

(3)第三个参数是排序的方法,可以是从大到小也可是从小到大,如果不写第三个参数,此时默认的排序方法是从小到大排序。

例1:sort默认从小到大排序

#include<iostream>
#include<algorithm>
using namespace std;

int main(){
	int a[10]={9,6,3,8,5,2,7,4,1,0};
	sort(a,a+10);
	for(int i=0;i<10;i++){
		cout<<a[i]<<" ";
	}
	cout<<endl;
	return 0;
}


例2:sort自定义从大到小排序

#include<iostream>
#include<algorithm>
using namespace std;

bool compare(int x,int y){
	return x>y;
}

int main(){
	int a[10]={9,6,3,8,5,2,7,4,1,0};
	sort(a,a+10,compare);
	for(int i=0;i<10;i++){
		cout<<a[i]<<" ";
	}
	cout<<endl;
	return 0;
}


例3:库函数定义less<数据类型>() & greater<数据类型>()

#include<iostream>
#include<algorithm>
using namespace std;

int main(){
	int a[10]={9,6,3,8,5,2,7,4,1,0};
	sort(a,a+10,less<int>());
	//sort(a,a+10,greater<int>());
	for(int i=0;i<10;i++){
		cout<<a[i]<<" ";
	}
	cout<<endl;
	return 0;
}


例4:对字符排序(九度OJ:1054)

#include<iostream>
#include<string.h>
#include<algorithm>
using namespace std;

int main(){
	char a[200];
	while(cin>>a){
		int n=strlen(a);
		sort(a,a+n);
		for(int i=0;i<n;i++){
			cout<<a[i];
		}
		cout<<endl;
	}
	return 0;
}



### C++ STL 中 `sort` 函数的工作原理和用法 #### 工作原理 C++ 标准模板库 (STL) 提供了一个高效的排序算法实现——`std::sort`。该函数采用了一种混合排序策略,通常被称为 IntroSort 或者引入排序。这种排序方法结合了快速排序、堆排序以及插入排序的优点,在大多数情况下能够提供接近 O(n log n) 的时间复杂度。 - 当数据量较小时,会切换到插入排序来优化性能; - 使用快速排序作为主要排序方式; - 如果检测到递归过深,则退化为堆排序以防止最坏情况的发生[^4]。 #### 基本语法与参数说明 以下是 `std::sort` 的基本声明形式: ```cpp template<class RandomIt> void sort(RandomIt first, RandomIt last); // 或带有比较器版本 template<class RandomIt, class Compare> void sort(RandomIt first, RandomIt last, Compare comp); ``` 这里有两个重载版本:一个是只接受两个迭代器范围 `[first, last)`;另一个额外接收一个谓词对象用于定义元素之间的顺序关系。对于后者来说,给定的二元谓词应当满足严格弱序的要求,即当且仅当第一个参数小于第二个参数时返回 true。 #### 实际应用案例 下面给出几个具体的例子展示如何利用 `std::sort` 对不同类型的容器进行升序排列操作: ##### 整数数组排序 ```cpp #include <algorithm> // 导入 std::sort #include <iostream> int main() { int arr[] = {50, 70, 60, 90}; const size_t length = sizeof(arr)/sizeof(*arr); std::sort(std::begin(arr), std::end(arr)); for(auto i : arr){ std::cout << " " << i; } } ``` 这段代码将会输出有序序列:“30 40 50 60”。 ##### 自定义结构体排序 如果想要按照特定字段对自定义类型的数据集进行排序,则可以通过传递第三个参数指定比较逻辑: ```cpp struct Person{ string name; unsigned age; bool operator<(const Person& rhs)const{return this->age<rhs.age;} }; vector<Person> people={ {"Alice",21},{"Bob",25},{"Charlie",20}, }; std::sort(people.begin(), people.end()); for(const auto &p:people){ cout<<p.name<<" is "<<p.age<<"\n"; } ``` 此程序片段将依据年龄从小到大打印每个人的信息。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值