C++中有专门给对象数组排序的类方法吗,就像Java中的sort
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++中有专门给对象数组排序的类方法吗,就像Java中的sort相关的知识,希望对你有一定的参考价值。
使用sort排序结构体网上例子很多的 就是先写一个排序函数然后让sort按照你的函数排序就行了
STL 里面有个 sort 函数,可以直接对数组排序,复杂度为 n*log2(n) 。使用这个函数,需要包含头文件。
这个函数可以传两个参数或三个参数。第一个参数是要排序的区间首地址,第二个参数是区间尾地址的下一地址。也就是说,排序的区间是 [a,b) 。简单来说,有一个数组 int a[100] ,要对从 a[0] 到 a[99] 的元素进行排序,只要写 sort(a,a+100) 就行了,默认的排序方式是升序。
拿我出的“ AC 的策略”这题来说,需要对数组 t 的第 0 到 len-1 的元素排序,就写 sort(t,t+len);
对向量 v 排序也差不多, sort(v.begin(),v.end());
如果是没有定义小于运算的数据类型,或者想改变排序的顺序,就要用到第三参数——比较函数。比较函数是一个自己定义的函数,返回值是 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(a,a+100,cmp); 参考技术A qsort(…)
C/C++基础之冒泡排序
排序算法作为编程语言中最基础的算法,在很多高级语言中系统都封装了sort方法,并提供自定义比较方法排序。但是,这背后是怎么实现的你真的知道吗?接下来几篇就给大家讲一讲C/C++里面最基础的集中数组排序方法实现吧。
冒泡排序
冒泡排序:顾名思义就是向气泡冒出来一样,谁大谁出来,在数组排序里就是谁大谁往后走。就像当初老师给我们排队的时候一样,按身高将一个最高个从前挨个比一直往后排
假设现在有一个数组{50,26,74,60,12,1,100}冒泡排序算法是怎么做的呢?
前一个跟后一个去比较大小,如果前一个比后一个大,则前面的跟后面的交换位置,再继续往后比,知道数组结束。我们看代码实现:
我们看运行结果:
排序成功。这里需要注意的一点就是第二个循环位置的循环条件for (int j = 0; j < sizeof(arr)/sizeof(int)-1-i; j++)这里一定要注意每比较完一趟后,后面的数已经是最大的了,已经排好了,再进行下一趟的时候我们就不需要再去跟它们比较了。并且由于比较里面已经取了j+1这个下标一定记得在循环条件里减1,不然就会越界
附上原代码:
#include <stdio.h>
#include <iostream>
using namespace std;
int main()
{
int arr[7] = {50,26,74,60,12,1,100};\
//这个循环式控制比较趟数,每趟都需要找出来一个最大的(除了已经排好的)
for (int i = 0; i < sizeof(arr)/sizeof(int)-1; i++)
{
//这个循环就是我在图示中表示的过程,最大的从前往后滚
for (int j = 0; j < sizeof(arr)/sizeof(int)-1-i; j++)
{
if(arr[j]>arr[j+1])
{
int temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp ;
}
}
}
//我们来输出一下看看排序成功没
for (int i = 0; i < sizeof(arr)/sizeof(int); i++)
{
cout<<arr[i]<<" ";
}
system("pause");
return 0 ;
}
以上是关于C++中有专门给对象数组排序的类方法吗,就像Java中的sort的主要内容,如果未能解决你的问题,请参考以下文章