Cpp--C++中排序常用(菜鸟上路,持续更新)

2023-10-28 12:58

本文主要是介绍Cpp--C++中排序常用(菜鸟上路,持续更新),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

C++中STL里面有个sort函数,可以直接对数组排序,使用这个函数,需要包含头文件<algorithm>。 这个函数可以传两个参数或三个参数。第一个参数是要排序的区间首地址,第二个参数是区间尾地址的下一地址。也就是说,排序的区间是[a,b)。简单来说,有一个数组int a[100],要对从a[0]到a[99]的元素进行排序,只要写sort(a,a+100)就行了,默认的排序方式是升序。排序的数据类型不局限于整数,只要是定义了小于运算的类型都可以,比如字符串类string。如果是没有定义小于运算的数据类型,或者想改变排序的顺序,就要用到第三参数——比较函数。比较函数是一个自己定义的函数,返回值是bool型,它规定了什么样的关系才是“小于”。想把刚才的整数数组按降序排列,可以先定义一个比较函数cmp。

bool cmp(int a,int b)
{return a>b;
}
   排序的时候就写sort(a,a+100,cmp);

   假设自己定义了一个结构体node

struct node{int a;int b;double c;
}
   有一个node类型的数组node arr[100],想对它进行排序:先按a值升序排列,如果a值相同,再按b值降序排列,如果b还相同,就按c降序排列。就可以写这样一个比较函数:

以下是代码片段:

bool cmp(node x,node y)
{if(x.a!=y.a) return x.a
if(x.b!=y.b) return x.b>y.b;return return x.c>y.c;
}     
排序时写sort(arr,a+100,cmp);

qsort(s[0],n,sizeof(s[0]),cmp);
int cmp(const void *a,const void *b)
{return *(int *)a-*(int *)b;
}

下面分类讨论:

一、对int类型数组排序  

int num[100];  
int cmp ( const void *a , const void *b )  
{  
return *(int *)a - *(int *)b;  
}  
qsort(num,100,sizeof(num[0]),cmp);  
二、对char类型数组排序(同int类型)   

char word[100];  
int cmp( const void *a , const void *b )  
{  
return *(char *)a - *(int *)b;  
}  
qsort(word,100,sizeof(word[0]),cmp);  
三、对double类型数组排序(特别要注意)   

double in[100];  
int cmp( const void *a , const void *b )  
{  
return *(double *)a > *(double *)b ? 1 : -1;  
}  
qsort(in,100,sizeof(in[0]),cmp);
四、对结构体一级排序   

<pre name="code" class="cpp">struct In  
{  
double data;  
int other;  
}s[100]  
//按照data的值从小到大将结构体排序,关于结构体内的排序关键数据data的类型可以很多种,参考上面的例子写  
int cmp( const void *a ,const void *b)  
{  
return ((In *)a)->data - ((In *)b)->data ;  
}  
qsort(s,100,sizeof(s[0]),cmp);  


 

五、对结构体 

struct In  
{  
int x;  
int y;  
}s[100];  
//按照x从小到大排序,当x相等时按照y从大到小排序  
int cmp( const void *a , const void *b )  
{  
struct In *c = (In *)a;  
struct In *d = (In *)b;  
if(c->x != d->x) return c->x - d->x;  
else return d->y - c->y;  
}  
qsort(s,100,sizeof(s[0]),cmp);  
六、对字符串进行排序   

struct In  
{  
int data;  
char str[100];  
}s[100];  
//按照结构体中字符串str的字典顺序排序  
int cmp ( const void *a , const void *b )  
{  
return strcmp( ((In *)a)->str , ((In *)b)->str );  
}  
qsort(s,100,sizeof(s[0]),cmp);  
七、对枚举型进行排序

enum Enumcomp{ASC,DESC};

然后开始用一个类来描述这个函数对象。它会根据它的参数来决定是采用“<”还是“>”。

class compare
{private:Enumcomp comp;public:compare(Enumcomp c):comp(c) {};bool operator () (int num1,int num2) {switch(comp){case ASC:return num1<num2;case DESC:return num1>num2;}}
};
接下来使用 sort(begin,end,compare(ASC)实现升序,sort(begin,end,compare(DESC)实现降序。

主函数为:

int main()
{int a[20]={2,4,1,23,5,76,0,43,24,65},i;for(i=0;i<20;i++)cout<<a[i]<<endl;sort(a,a+20,compare(DESC));for(i=0;i<20;i++)cout<<a[i]<<endl;return 0;
}

八、利用函数模版进行排序任务

其实对于这么简单的任务(类型支持“<”、“>”等比较运算符),完全没必要自己写一个类出来。标准库里已经有现成的了,就在functional里,include进来就行了。functional提供了一堆基于模板的比较函数对象。它们是(看名字就知道意思了):equal_to<Type>、not_equal_to<Type>、greater<Type>、greater_equal<Type>、less<Type>、less_equal<Type>。对于这个问题来说,greater和less就足够了,直接拿过来用:

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

int _tmain(int argc, _TCHAR* argv[])
{int a[20]={2,4,1,23,5,76,0,43,24,65},i;for(i=0;i<20;i++)cout<<a[i]<<endl;sort(a,a+20,greater<int>());for(i=0;i<20;i++)cout<<a[i]<<endl;return 0;
}


九、迭代器中string排序

既然有迭代器,如果是string 就可以使用反向迭代器来完成逆序排列,程序如下:

int main()
{string str("cvicses");string s(str.rbegin(),str.rend());cout << s <<endl;return 0;
}

附上C++中另外函数:

  
函数名 功能描述
sort                                对给定区间所有元素进行排序
stable_sort                对给定区间所有元素进行稳定排序
partial_sort                对给定区间所有元素部分排序
partial_sort_copy       对给定区间复制并排序
nth_element               找出给定区间的某个位置对应的元素
is_sorted               判断一个区间是否已经排好序
partition                      使得符合某个条件的元素放在前面
stable_partition       相对稳定的使得符合某个条件的元素放在前面
 








这篇关于Cpp--C++中排序常用(菜鸟上路,持续更新)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/293367

相关文章

HarmonyOS学习(七)——UI(五)常用布局总结

自适应布局 1.1、线性布局(LinearLayout) 通过线性容器Row和Column实现线性布局。Column容器内的子组件按照垂直方向排列,Row组件中的子组件按照水平方向排列。 属性说明space通过space参数设置主轴上子组件的间距,达到各子组件在排列上的等间距效果alignItems设置子组件在交叉轴上的对齐方式,且在各类尺寸屏幕上表现一致,其中交叉轴为垂直时,取值为Vert

JS常用组件收集

收集了一些平时遇到的前端比较优秀的组件,方便以后开发的时候查找!!! 函数工具: Lodash 页面固定: stickUp、jQuery.Pin 轮播: unslider、swiper 开关: switch 复选框: icheck 气泡: grumble 隐藏元素: Headroom

【C++ Primer Plus习题】13.4

大家好,这里是国中之林! ❥前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。有兴趣的可以点点进去看看← 问题: 解答: main.cpp #include <iostream>#include "port.h"int main() {Port p1;Port p2("Abc", "Bcc", 30);std::cout <<

C++包装器

包装器 在 C++ 中,“包装器”通常指的是一种设计模式或编程技巧,用于封装其他代码或对象,使其更易于使用、管理或扩展。包装器的概念在编程中非常普遍,可以用于函数、类、库等多个方面。下面是几个常见的 “包装器” 类型: 1. 函数包装器 函数包装器用于封装一个或多个函数,使其接口更统一或更便于调用。例如,std::function 是一个通用的函数包装器,它可以存储任意可调用对象(函数、函数

poj3468(线段树成段更新模板题)

题意:包括两个操作:1、将[a.b]上的数字加上v;2、查询区间[a,b]上的和 下面的介绍是下解题思路: 首先介绍  lazy-tag思想:用一个变量记录每一个线段树节点的变化值,当这部分线段的一致性被破坏我们就将这个变化值传递给子区间,大大增加了线段树的效率。 比如现在需要对[a,b]区间值进行加c操作,那么就从根节点[1,n]开始调用update函数进行操作,如果刚好执行到一个子节点,

hdu1394(线段树点更新的应用)

题意:求一个序列经过一定的操作得到的序列的最小逆序数 这题会用到逆序数的一个性质,在0到n-1这些数字组成的乱序排列,将第一个数字A移到最后一位,得到的逆序数为res-a+(n-a-1) 知道上面的知识点后,可以用暴力来解 代码如下: #include<iostream>#include<algorithm>#include<cstring>#include<stack>#in

hdu1689(线段树成段更新)

两种操作:1、set区间[a,b]上数字为v;2、查询[ 1 , n ]上的sum 代码如下: #include<iostream>#include<algorithm>#include<cstring>#include<stack>#include<queue>#include<set>#include<map>#include<stdio.h>#include<stdl

C++11第三弹:lambda表达式 | 新的类功能 | 模板的可变参数

🌈个人主页: 南桥几晴秋 🌈C++专栏: 南桥谈C++ 🌈C语言专栏: C语言学习系列 🌈Linux学习专栏: 南桥谈Linux 🌈数据结构学习专栏: 数据结构杂谈 🌈数据库学习专栏: 南桥谈MySQL 🌈Qt学习专栏: 南桥谈Qt 🌈菜鸡代码练习: 练习随想记录 🌈git学习: 南桥谈Git 🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈�

【数据结构】——原来排序算法搞懂这些就行,轻松拿捏

前言:快速排序的实现最重要的是找基准值,下面让我们来了解如何实现找基准值 基准值的注释:在快排的过程中,每一次我们要取一个元素作为枢纽值,以这个数字来将序列划分为两部分。 在此我们采用三数取中法,也就是取左端、中间、右端三个数,然后进行排序,将中间数作为枢纽值。 快速排序实现主框架: //快速排序 void QuickSort(int* arr, int left, int rig

【C++】_list常用方法解析及模拟实现

相信自己的力量,只要对自己始终保持信心,尽自己最大努力去完成任何事,就算事情最终结果是失败了,努力了也不留遗憾。💓💓💓 目录   ✨说在前面 🍋知识点一:什么是list? •🌰1.list的定义 •🌰2.list的基本特性 •🌰3.常用接口介绍 🍋知识点二:list常用接口 •🌰1.默认成员函数 🔥构造函数(⭐) 🔥析构函数 •🌰2.list对象