【C转C++】struct和sort函数的简易使用

C转C++之struct和sort函数

之前由详细讲过排序的妙用,详情可以传送,这里就不赘述了。但有一个很现实的问题就是每次解题的时候C根本就没有自带sort函数呀!!为了防止冒泡排序或桶排序超时,只能打上快速排序的代码(不得不说,太长了,也很容易因为一些小细节而写错),因为这个原因挺烦心的,这也是为什么我一直想转C++的原因。


C与C++之struct的异同

顺便先提一下两者的不同,在C语言中,在定义好struct后使用的时候要写上关键字struct,到C++就可以省略不写啦!万岁!

struct point{

	int x,y;

};

//struct point p[100];

//传统C就要加上关键字struct

point p2[100];

C与C++之sort函数

据C++ PRIMER可知其实C++的内置排序函数很丰富,详情如下

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

但就我个人的使用情况来看,可能用的上的只有sort函数了,也因为篇幅原因,本篇博客只重点强调和讲解sort的升序和降序排列,更多资料可阅读专业书籍。

先来看看复杂度吧,n*log2n,比冒泡之类的排序算法效率要高,但没有快排快(但其实也差不了多少)
其他常见排序算法可见这篇文章

标准形式

先要引入头文件

#include <algorithm>

sort的对象可以是vector数组也可以是传统的int a[]的数组
如果你是学C,还不知道vector,可以看下这篇文章

具体形式

sort(start,end,cmp)

*start表示排序数组的起始地址(要是地址!!)

如果用vector数组的话,因为vector是容器,故要用v.begin() v.end()表示头尾

如果用传统的int a[]的数组就可以直接用a a+n表示头尾

*end表示数组结束地址的下一位(是下一位!!可以类比字符串的’\0’)

扫描二维码关注公众号,回复: 12090279 查看本文章

*cmp自定义排序方法,可不填,默认升序

如果要降序排列咋办?

补上cmp这个函数

bool cmp(int a, int b){

	return a>b;

}

关于这个我的理解是这样的,如果要升序,那么右边肯定是最大的嘛,就是A<B<C<也就是<
如果是降序,左边最大,就是A>B>C>也就是>
这样可能会有助于你记忆cmp这个函数

使用示例

#include <iostream> 
#include <vector>
#include <algorithm>
using namespace std;

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

int main(){
	int i;
	int a1[]={3,4,2,5,8,7,6,9,1};
	vector<int> a2(9);
	

	for ( i=0; i<9; i++ )
		cin >> a2[i];
		
	sort ( a1, a1+9 );
	sort ( a2.begin(), a2.end());
	
	for ( i=0; i<9; i++ )
		cout << a1[i];
	cout << endl;
		
	for ( i=0; i<9; i++ )
		cout << a2[i];
	cout << endl; 
	
	return 0; 

}

进阶用法

以下内容摘自百度百科,其实这个进阶用法在我们生活中也比较常见,比如高考总分相同的情况下,理科生看数学成绩进行排名,但因为我目前用不到,所以就不深入讲解,以后有时间再另外写一篇来总结。

假设自己定义了一个结构体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<y.a;    
if(x.b!==y.b) return x.b>y.b;    
return x.c>y.c;
}

猜你喜欢

转载自blog.csdn.net/m0_49973750/article/details/109431018
今日推荐