Sort是C++std中含有的函数,而C语言中并没有。
因此不仅需要头文件
#include<iostream>
和
#include<cstdio>
还需要
#include<algorithm>(Sort的头文件)
sort(a,a+n,cmp)含有三个参数,第一个参数是起始地址,第二个参数是末地址;这两个地址一般是数组(包括结构体数组)。
其表示对[a,a+n)区间内的元素以cmp的方式进行排序,
注意是左闭右开!
注意是左闭右开!
注意是左闭右开!(极易出错)
若对整个数组进行排序则n就等于数组长度。
第三个参数可有可无:
无则默认顺序排序,无cmp时亦可对字符串内部进行排序;
有则按照该参数的规则排序。
1.当cmp为greater<T>()时,排序结果为逆序,其中T为任意种类的数据类型。
2.当需要对结构体进行排序时,需要创建一个cmp函数,类型为bool类型,参数为(T a,T b)
其中T 为结构体名称;
函数内容:
return (表达式);
其中
若表达式值为1,则a排在b前面;
若值为0,,则b排在a前面;
例如
I.对于数的比较:
{
return a.num>b.num;
}
此时大的排在前面;
{
return a.num<b.num;
}
此时小的排在前面;
II.对于不同字符串间大小的比较:
最好直接使用C++的string,即在结构体中创建一个字符串时如此做:
string str;
string类型的变量可以直接用>,<,==来比较大小,其比较方法是按照字典序逐字母进行比较,同<string.h>中的strcmp()函数比较方式相同,即遇到不同字符或'\0'时得出比较结果.
string的简单用法:
还可以用string定义字符串数组,如 string str[10];
string.size()是指字符串的字符个数
输入string类型的变量用C++中的
cin>>str;
输出则使用
cout<<str;(被迫学习C++)
而不能使用scanf,puts,gets等C中的函数.
时间复杂度:o(NlogN);
STL
中的sort
并非只是普通的快速排序,除了对普通的快速排序进行优化,它还结合了插入排序和堆排序。根据不同的数量级别以及不同情况,能自动选用合适的排序方法。当数据量较大时采用快速排序,分段递归。一旦分段后的数据量小于某个阀值,为避免递归调用带来过大的额外负荷,便会改用插入排序。而如果递归层次过深,有出现最坏情况的倾向,还会改用堆排序。
下面是洛谷P1781题解,运用了字符串排序解决了大数比较:
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<string>
using namespace std;
struct pre {
string vote;
int num;
};
bool cmp(pre a, pre b)
{
if (a.vote.size() > b.vote.size())//因为string直接比较的方式同strcmp,所以要先比较位数
return 1;
else if (a.vote.size() < b.vote.size())
return 0;
else
return (a.vote > b.vote);//位数相同时再逐字符比较
}
int main()
{
int n, i;
pre president[21];
scanf_s("%d", &n);
for (i = 1; i <= n; i++)
{
cin >> president[i].vote;
president[i].num = i;
}
sort(president + 1, president + n + 1, cmp);
printf("%d\n", president[1].num);
cout << president[1].vote;
}
了解更多关于String的用法详解,前往C++ string 用法详解 (byvoid.com)