c++ sort使用,sort 底层实现分析(例题理解)


🐧首先讲一下,我是偶然做到一个排序的题目,然后觉得这个题目里使用 c++ sort 使用的非常经典,所以就有了这一篇文章
请添加图片描述

1.sort 的使用

👌 头文件

 #include    <algorithm>

👌 函数参数

	sort( 数组首地址,数组结束地址,排序方式)

👌 使用实例
如果我们要对一个含有十个元素的数组进行排序,根据上面参数的使用,代码如下。

#include <iostream>
#include <algorithm>

using namespace std;

const int N = 10;
int main()
{
    int q[10] = {123,121,1,2,45,-546,-4,84,54,20};// 初始化十个数据的无序数组

    for(int i = 0; i < N; i ++)  cout<<q[i]<<" ";  //输出排序前的样子

    cout<<endl<<endl<<endl;  // 打印多个换行为了让输出结果更加好看

    sort(q, q + N); //调用函数进行排序

    for(int i = 0; i < N; i ++) cout<<q[i]<<" "; //输出排序后的样子

    cout<<endl<<endl<<endl;//同上

    return 0;

}

在这里插入图片描述

👍 注意点
我这里并没有使用第3个参数,来确定它的排序方式,而我们看结果是从小到大。
所以这里得出第一个结论,如果不使用第三个参数的话,默认就是把数据从小到大排好
👍 参数3使用

int cmp(int a, int b)
{
    return a>b;//这里如果是 a>b 就是排降序, a < b 就是排升序
}

ok,这里把排序调用换成如下

 sort(q, q + N,cmp); //调用函数进行排序

那么排序结果
在这里插入图片描述

2.sort函数参数底层详解

常规使用底层逻辑

在这里插入图片描述

😍我们发现当我们使用 sort(a, a + N) 排序时,按照正常的逻辑,是不是应该把a到 a+N的元素全部排序呢(这里也就是把标红的地方全部排序)?

如果把标红的位置全部排序了,那么会超出我们原来数组 q 的范围

😍所以这里得出结论:
sort 排序是左边闭区间,也就是包含 a 所在元素,右边是开区间,也就是不包含 a+N 这个元素

注意点

这里小小的提一点,因为左闭右开这个特性,在vector容器里使用sort时我们要弄清楚,vector返回尾地址的位置

3.sort的排序方法

对于数据量大的排序,会使用快速排序,当快速排序数据量小于某一个阈值,会转变成插入排序,当递归层次比较深的时候,会采用堆排序

4.sort理解例题

洛谷p1068 分数线划定
这是一道排序的题,这里我给出原题目。

[NOIP2009 普及组] 分数线划定

题目描述

世博会志愿者的选拔工作正在 A 市如火如荼的进行。为了选拔最合适的人才,A 市对所有报名的选手进行了笔试,笔试分数达到面试分数线的选手方可进入面试。面试分数线根据计划录取人数的 150 % 150\% 150% 划定,即如果计划录取 m m m 名志愿者,则面试分数线为排名第 m × 150 % m \times 150\% m×150%(向下取整)名的选手的分数,而最终进入面试的选手为笔试成绩不低于面试分数线的所有选手。

现在就请你编写程序划定面试分数线,并输出所有进入面试的选手的报名号和笔试成绩。

输入格式

第一行,两个整数 n , m ( 5 ≤ n ≤ 5000 , 3 ≤ m ≤ n ) n,m(5 \leq n \leq 5000,3 \leq m \leq n) n,m(5n5000,3mn),中间用一个空格隔开,其中 n n n 表示报名参加笔试的选手总数, m m m 表示计划录取的志愿者人数。输入数据保证 m × 150 % m \times 150\% m×150% 向下取整后小于等于 n n n

第二行到第 n + 1 n+1 n+1 行,每行包括两个整数,中间用一个空格隔开,分别是选手的报名号 k ( 1000 ≤ k ≤ 9999 ) k(1000 \leq k \leq 9999) k(1000k9999)和该选手的笔试成绩 s ( 1 ≤ s ≤ 100 ) s(1 \leq s \leq 100) s(1s100)。数据保证选手的报名号各不相同。

输出格式

第一行,有 2 2 2 个整数,用一个空格隔开,第一个整数表示面试分数线;第二个整数为进入面试的选手的实际人数。

从第二行开始,每行包含 2 2 2 个整数,中间用一个空格隔开,分别表示进入面试的选手的报名号和笔试成绩,按照笔试成绩从高到低输出,如果成绩相同,则按报名号由小到大的顺序输出。

样例 #1

样例输入 #1

6 3 
1000 90 
3239 88 
2390 95 
7231 84 
1005 95 
1001 88

样例输出 #1

88 5 
1005 95 
2390 95 
1000 90 
1001 88 
3239 88

提示

【样例说明】

m × 150 % = 3 × 150 % = 4.5 m \times 150\% = 3 \times150\% = 4.5 m×150%=3×150%=4.5,向下取整后为 4 4 4。保证 4 4 4 个人进入面试的分数线为 88 88 88,但因为 88 88 88 有重分,所以所有成绩大于等于 88 88 88 的选手都可以进入面试,故最终有 5 5 5 个人进入面试。

NOIP 2009 普及组 第二题

解题思路

认真分析题目,其实我们发现,我们只需要先按照两个规则排序
先按分数排序,如果分数一样的话,就按报名号排序。
分数为降序,报名号为升序。

AC代码
#include <bits/stdc++.h>//万能头文件

using namespace std;

const int N = 5e3 + 10;

int sub[N], f, k[N], s[N];

bool cmp(int a, int b)
{
    if(s[a] == s[b]) return k[a] < k[b];//分数相同,按照报名号排升序
    return s[a] > s[b];//分数不同,就按照分数排降序
}

int main()
{
    int n, m;
    scanf("%d %d", &n, &m);

    for(int i = 0; i < n; i ++) cin>> k[sub[i] = i] >> s[i];//输入
    //k数组存放报名号, sub 数组存放下标, s数组存放分数
    

    sort(sub, sub + n, cmp);//其实这里的排序都是对于sub中存放的下标进行排序的

    m = m * 1.5;  // 按照要求向下取整百分之150
    int i;
    for( i = 0; s[sub[i]] >= s[sub[m - 1]]; i++);//统计满足分数线的人数

    cout<<s[sub[m-1]]<<" "<<i<<endl;//按照题目要求输出分数线和人数

    for(i = 0; s[sub[i]] >= s[sub[m-1]]; i++) cout<<k[sub[i]]<<" "<<s[sub[i]]<<endl;
    //最后输处所有进入面试的报名号跟分数
    return 0;
}

如果这里题解看不懂,可以去洛谷上面看。

5.以上的一部分是我看了两位大佬写的sort,然后自己思考总结合成的,这里附上原文链接,请两位大佬不要在乎我的搬运。

c++ sort 底层
sort 底层排序逻辑

每日语录

少年没有乌托邦,心向远方自明朗!

这里再献上一首我们学校辅导员写的一首诗。

问鼎吉大
天门巍巍壮雄志,醴水涛涛映红日。
佳节逢疫悲寂寞,追风赶月莫逍遥。
争学真赶正当时,膳始善终擅博识。
丛文馆里擘宏图,卧虎园中论英雄。

再见!!!
请添加图片描述

  • 23
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
C++中,可以使用标准库中的`std::sort`函数对容器中的元素进行排序。`std::sort`函数的用法如下: ```cpp #include <algorithm> std::sort(begin, end) ``` 其中,`begin`和`end`分别是排序范围的起始和结束迭代器,表示要排序的元素的范围。 下面是一个示例代码,展示如何使用`std::sort`函数对整型数组进行升序排序: ```cpp #include <iostream> #include <algorithm> #include <vector> int main() { std::vector<int> nums = {5, 2, 9, 1, 3}; // 对整型数组进行升序排序 std::sort(nums.begin(), nums.end()); // 输出排序后的结果 for (int num : nums) { std::cout << num << " "; } std::cout << std::endl; return 0; } ``` 上述代码中,我们使用`std::sort`函数对整型数组`nums`进行升序排序。通过传入`nums.begin()`和`nums.end()`作为参数,指定了要排序的范围。最后,我们使用循环输出排序后的结果。 如果需要对自定义的数据类型进行排序,可以通过重载比较运算符(`<`)来定义元素之间的比较规则,或者通过自定义比较函数来传递给`std::sort`函数。例如: ```cpp struct Person { std::string name; int age; }; bool compareAge(const Person& person1, const Person& person2) { return person1.age < person2.age; } int main() { std::vector<Person> people = {{"Alice", 25}, {"Bob", 30}, {"Charlie", 20}}; // 对自定义的数据类型进行排序,按照年龄升序排序 std::sort(people.begin(), people.end(), compareAge); // 输出排序后的结果 for (const Person& person : people) { std::cout << person.name << " (" << person.age << ") "; } std::cout << std::endl; return 0; } ``` 上述代码中,我们定义了一个自定义的数据类型`Person`,包含姓名和年龄两个成员变量。然后,我们定义了一个比较函数`compareAge`,用于按照年龄升序排序。在`std::sort`函数中,我们通过传入`compareAge`函数作为第三个参数,指定了元素之间的比较规则。最后,我们使用循环输出排序后的结果。 总结来说,`std::sort`函数是C++标准库中用于排序的函数,可以对容器中的元素进行升序排序。对于自定义的数据类型,可以通过重载比较运算符或者自定义比较函数来指定元素之间的比较规则。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我不会画饼鸭

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值