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’)
*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; }