C++ STL之排序算法

排序算法和查找算法差不多,也涉及到迭代器区间问题,关于该问题的注意事项就不在啰嗦了

一、全部排序sort、stable_sort

sort是一种不稳定排序,使用时需要包含头文件algorithm

默认可以传两个参数或三个参数。第一个参数是要排序的区间首地址,第二个参数是区间尾地址的下一地址。如果只传入这两个地址的话,就按照升序对指定地址区间排序。想要按照降序排列的话,需要传入第三个函数,第三个函数可以自己写cmp,也可以直接调用库函数

greater<data-type>(),使用库函数的时候要包含头文件functional。

总结如下:

#include<algorithm>

#include<functional>

升序:sort(begin,end,less<data-type>());

降序:sort(begin,end,greater<data-type>()).

 1 #include<iostream>
 2 #include<algorithm>
 3 #include<functional>
 4 using namespace std;
 5 int main()
 6 {
 7     int a[9]={454,45564,6,3,5,65,32,53,5};
 8     //升序
 9     sort(a,a+9,less<int>());
10     cout<<"升序排序结果"<<endl;
11     for(int i=0;i<9;i++)
12     {
13         cout<<a[i]<<endl;
14     }
15     //降序
16     sort(a,a+9,greater<int>());
17     cout<<"降序排序结果"<<endl;
18     for(int i=0;i<9;i++)
19     {
20         cout<<a[i]<<endl;
21     }
22     return 0;
23 }

如果忘记了升序或者降序后面的那个方法名称,也可以自己写个简单的

bool cmp(int a,int b)
{
 return a>b;
}
sort(a,a+9,cmp);

就是降序

bool cmp(int a,int b) 
{ 
return a<b; 
}
sort(a,a+9,cmp); 

就是升序

与之对应的有一个stable_sort()用法与sort一样,是稳定排序。

二、部分排序partial_sort、partial_sort_copy

 1 #include<iostream>
 2 #include<algorithm>
 3 using namespace std;
 4 int main()
 5 {
 6     int num[10]={3,4,6,7,3,5,2,9,7,8};
 7     for(int i=0;i<10;i++)
 8     {
 9         cout<<num[i]<<" ";
10     }
11     cout<<endl;
12     //partial_sort
13     //void partial_sort(_RanIt _First, _RanIt _Mid, _RanIt _Last, _Pr _Pred)
14     //选出[_First, _Last)之间的_Mid-_First个数进行排序,放在_First到_Mid位置,剩下的在_Mid到_Last的元素不排序,pred是排序方式
15     partial_sort(num,num+3,num+10);
16     for(int i=0;i<10;i++)
17     {
18         cout<<num[i]<<" ";
19     }
20     cout<<endl;
21 
22     //partial_sort_copy
23     //_RanIt partial_sort_copy(_InIt _First1, _InIt _Last1,_RanIt _First2, _RanIt _Last2, _Pr _Pred)
24     int shuzi[10]={3,4,6,7,3,5,2,9,7,8};
25     int result1[3];
26     int result2[12];
27     partial_sort_copy(shuzi,shuzi+10,result1,result1+3);
28     for(int i=0;i<10;i++)
29     {
30         cout<<shuzi[i]<<" ";
31     }
32     cout<<endl;
33     for(int i=0;i<3;i++)
34     {
35         cout<<result1[i]<<" ";
36     }
37     cout<<endl;
38         
39     partial_sort_copy(shuzi,shuzi+10,result2,result2+12);
40     for(int i=0;i<10;i++)
41     {
42         cout<<shuzi[i]<<" ";
43     }
44     cout<<endl;
45     for(int i=0;i<12;i++)
46     {
47         cout<<result2[i]<<" ";
48     }
49     cout<<endl;
50     return 0;
51 }

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏数据结构与算法

codevs 1213 解的个数

1213 解的个数 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 Description 已知整数x...

3394
来自专栏编程札记

java之hashtable和hashmap

1746
来自专栏Java帮帮-微信公众号-技术文章全总结

【编程题】Java编程题一(10道)

【编程题】Java编程题一(10道) 【程序1】 题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,...

4448
来自专栏Java爬坑系列

【Java入门提高篇】Day33 Java容器类详解(十五)PriorityQueue详解

 今天要介绍的是基础容器类(为了与并发容器类区分开来而命名的名字)中的另一个成员——PriorityQueue,它的大名叫做优先级队列,想必即使没有用过也该有所...

1211
来自专栏包子铺里聊IT

那些年我们一起遍历过的树

这篇博文想和大家讨论一下tree的traversal有哪些方法。当然我们都很熟悉DFS(InOrder, PreOrder, PostOrder)和BFS,这...

2667
来自专栏about云

Scala的map实现key和value排序及各种排序比较等知识讨论

问题导读 1.map能否直接排序? 2.如何转换,才能排序? 3.排序结果可以存储在哪两个集合中? 4._*如何使用? 5.排序函数中,哪个可以进行升序和降序...

3728
来自专栏闵开慧

曾经做过的40道程序设计课后习题总结(三)

曾经做过的40道程序设计课后习题总结(三) 课后习题目录 1 斐波那契数列 2 判断素数 3 水仙花数 4 分解质因数 5 杨辉三角 6 学习成绩查询 7 求最...

3978
来自专栏机器学习与自然语言处理

用只含一个链域的节点实现循环链表的双向遍历

通常来说,要实现循环双向链表,每个节点需要有两个链域:前驱和后继。现在的问题是:如何设计一种环形表,使表的每个结点只包含一个链域而又能够有效地对其进行两个方向的...

2115
来自专栏机器学习入门

挑战程序竞赛系列(86):3.6极限情况(3)

挑战程序竞赛系列(86):3.6极限情况(3) 传送门:AOJ 2201: Immortal Jewels 翻译参考至hankcs: http://www....

21910
来自专栏SeanCheney的专栏

《Pandas Cookbook》第01章 Pandas基础

公司网址,http://www.dunderdata.com(dunder是蒸馏朗姆酒的残留液体,取这个名字是类比数据分析过程) GitHub地址:https...

1522

扫码关注云+社区

领取腾讯云代金券