std::sort 是 C++ 标准库提供的排序函数,定义在 <algorithm> 头文件中。使用前需通过 #include <algorithm> 包含该头文件。

该函数采用快速排序或其改进算法实现。在平均情况下,其时间复杂度为 O(nlogn),其中 n 表示待排序元素数量。虽然最坏情况下(如已排序数组)时间复杂度可能退化为 O(n²),但现代实现(如 C++ 标准库)通过优化策略(如随机选取基准值)有效规避了这种情况。

相比其他排序算法(如时间复杂度为 O(n²) 的冒泡排序),std::sort 在绝大多数场景下都具有更优的性能表现。

1.基本格式

在这里面*比较函数,表示可写可不写

#include<algorithm> 
#include<iostream>
using namespace std;
int main(){
	int a[]={2,5,1,6,8};
	int t = sizeof(a)/sizeof(a[0]); 
	cout <<"数组的长度为:"<< t <<"\n";
	sort(a, a+t); //这个是一个左闭右开区间 
	for(int i : a){
	printf("%d ",i);}
	return 0;
}

运行结果

这段代码通过int t = sizeof(a) / sizeof(a[0])计算数组a的长度。其中:

  • sizeof(a)获取整个数组的字节大小
  • sizeof(a[0])获取单个元素的字节大小 两者相除即可得到数组的元素总数。

sort(a, a + t);:调用sort函数对数组a的前t个元素进行排序。该函数接收两个迭代器参数,分别表示排序范围的起始位置(a)和结束位置(a + t),遵循左闭右开区间原则。

2.使用迭代器

#include<algorithm> 
#include<iostream>
#include<vector>
using namespace std;
int main(){
vector<int> v = {5, 1, 3, 9, 11};
sort(v.begin(), v.end());
for (int i = 0; i < v.size(); ++i) cout << v[i] << ' ';//这里也可以使用for (int num : v) cout << num << ' '; 
	return 0;
}

动态数组的begin()指向首元素,end()指向末元素的下一个位置。例如,使用vector<int> v = {5, 1, 3, 9, 11};即可创建一个包含5个元素的动态数组。动态数组的主要特性包括:

  1. 支持运行时调整大小
  2. 支持随机访问(O(1)时间复杂度)
  3. 尾部操作高效(O(1)时间复杂度)
  4. 自动内存管理,但扩容时可能产生性能开销
  5. 底层基于数组实现,保证存取效率

3.自定义比较函数

#include<bits/stdc++.h> 
using namespace std;

bool cmp(const int &u,const int &v){
	return u>v;
}

int main(){
vector<int> v = {5, 1, 3, 9, 11};
sort(v.begin(), v.end(),cmp);
for (int i = 0; i < v.size(); ++i) cout << v[i] << ' ';//这里也可以使用for (int num : v) cout << num << ' '; 

	return 0;
}

sort默认采用小于运算符进行排序。要自定义比较规则,可通过第三个参数传递比较函数或lambda表达式。这段代码通过自定义的cmp函数实现数组降序排序:当第一个参数大于第二个参数时返回true,表示应将前者排在前面。sort函数基于此比较规则对数组元素进行两两比较和位置交换,最终将较大数值排列在前,较小数值在后,从而完成降序排列。

4.自定义比较函数

解法一

#include<bits/stdc++.h>
using namespace std;
int main(){
	int l = 0,i=0;
	scanf("%d",&l);
	vector<int> a;
	for(int i=0;i<l;i++){
		int x; 
		scanf("%d",&x);
		a.push_back(x);
	}
	sort(a.begin(),a.end());
	 for(int i=0;i<l;i++){
	 	printf("%d",a[i]);
	 	if(i!=l-1)
		 printf(" ");
	 }
	 printf("\n");
	 
	  for(int n=l-1 ;n>=0;n--){
	  	printf("%d ",a[n]);
	  		if(i!=0)
		 printf(" ");
	  }
	return 0;
}
for(int i=0;i<l;i++){
		int x; 
		scanf("%d",&x);
		a.push_back(x);
	}

这个地方不直接使用scanf的原因是:

  • scanf的工作方式

    • scanf需要一个 具体变量的地址 来存储输入值。

    • 动态数组(如std::vector)的元素不是直接通过地址访问的,而是通过push_back等方法动态添加到内存中。

  • 动态数组的动态特性

    • 动态数组(如std::vector)的大小是可变的,它会根据需要自动扩展内存。

    • scanf无法直接操作动态数组的内存管理机制,因此无法直接将值存入动态数组。

解法二

#include <bits/stdc++.h>
using namespace std;

int main()
{
    int n;
    cin >> n;
    vector<int> a(n); // 使用动态数组,避免越界问题
    for(int i = 0; i < n; ++i) cin >> a[i];
    sort(a.begin(), a.end()); // 升序排序
    for(int i = 0; i < n; ++i) cout << a[i] << (i == n - 1 ? "\n" : " ");
    sort(a.begin(), a.end(), [](const int &u, const int &v) { return u > v; }); // 降序排序
    for(int i = 0; i < n; ++i) cout << a[i] << (i == n - 1 ? "\n" : " ");
    return 0;
}
for(int i = 0; i < n; ++i) cout << a[i] << (i == n - 1 ? "\n" : " ");

(i == n - 1 ? "\n" : " ")

  • 使用三元运算符?判断是否是数组的最后一个元素:

    • 如果是最后一个元素(i == n - 1),则输出换行符"\n"

    • 否则,输出空格" "

sort(a.begin(), a.end(), [](const int &u, const int &v) { return u > v; }); // 降序排序
  • 再次调用sort函数,但这次通过lambda表达式定义了一个降序排序的比较器:

    • [](const int &u, const int &v) { return u > v; }是一个匿名函数(lambda表达式)。

    • 比较器的逻辑是:如果u > v,则认为u应该排在v之前,从而实现降序排序。

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐