蓝桥杯备赛------chapter 3 c++的排序
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个元素的动态数组。动态数组的主要特性包括:
- 支持运行时调整大小
- 支持随机访问(O(1)时间复杂度)
- 尾部操作高效(O(1)时间复杂度)
- 自动内存管理,但扩容时可能产生性能开销
- 底层基于数组实现,保证存取效率

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之前,从而实现降序排序。
-
更多推荐



所有评论(0)