行路难,行路难,多歧路,今安在?
长风破浪会有时,直挂云帆济沧海。
sort()
Sort函数有三个参数:
(1)第一个是要排序的数组的起始地址。
(2)第二个是结束的地址(最后一位要排序的地址)
(3)第三个参数是排序的方法,可以是从大到小也可是从小到大,
还可以不写第三个参数,此时默认的排序方法是从小到大排序。
例1:int类型
int a[10]={9,6,3,8,5,2,7,4,1,0};
sort(a,a+10);
输出:0 1 2 3 4 5 6 7 8 9
如果想降序排列数组的话
bool complare(int a,int b){
return a>b;
}
int a[10]={9,6,3,8,5,2,7,4,1,0};
sort(a,a+10,complare);
输出:9 8 7 6 5 4 3 2 1 0
还有更简便的方法:
less<数据类型>() //从小到大排序
greater<数据类型>() //从大到小排序
例2:字符类型
sort()功能强大,可以排序一个字符串内的字符,也可以排序字符串与字符串
字符串内:
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
int main()
{
string s;
cin>>s;
sort(s.begin(),s.end());///从小到大
cout<<s<<endl;
sort(s.begin(),s.end(),greater<char>());///从大到小
cout<<s<<endl;
cout<<s.length()<<endl;///字符串长度函数
}
字符串间:
#include<cstdio>
#include<iostream>
#include<cstdlib>
#include<algorithm>
#include<cstring>
using namespace std;
bool cmp(string a,string b)///按照字典序从大到小排序
{
return a>b;
}
bool cmp1(string a,string b)///按照长度从小到大排序
{
return a.length()<b.length();
}
int main()
{
int i,j;
string s[12]=
{
"January",
"February",
"March",
"April",
"May",
"June",
"July",
"August",
"September",
"October",
"November",
"December"
};
sort(s,s+12);//字符串默认按照字典序从小到大排序,数默认按照大小从小到大排序
for(i=0;i<12;i++)
cout<<s[i]<<endl;
cout<<endl;
sort(s,s+12,cmp);//按照字典序从大到小排序
for(i=0;i<12;i++)
cout<<s[i]<<endl;
cout<<endl;
sort(s,s+12,cmp1);//按照字符串长度排序
for(i=0;i<12;i++)
cout<<s[i]<<endl;
return 0;
}
运行结果:
还有一种就是根据结构体中的某一项来排序:
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
const int n=3;
struct Student
{
char name[20];///姓名
char id[20]; ///学号
int score; ///成绩
int r; ///排名
}stu[100010];
/*
(1)如果两个学生的分数不同,则分数高的排在前面
(2)否则,将姓名字典序小的排在前面
*/
bool cmp(Student a,Student b)
{
if(a.score!=b.score) return a.score>b.score;
else return strcmp(a.name,b.name)<0;
}
/*
排名的实现,一般规则为:分数不同,排名不同,分数相同排名相同但占用同一个排位
例如:分数为90,88,88,88,86;排名为1,2,2,2,5
*/
void Rank()
{
int i,j;
stu[0].r=1;
for(i=1;i<n;i++)
{
if(stu[i].score==stu[i-1].score) stu[i].r=stu[i-1].r;
else stu[i].r=i+1;
}
}
int main()
{
int i,j;
stu[0]=(Student){"guo","001",82,3};
stu[1]=(Student){"zhang","002",82,3};
stu[2]=(Student){"wu","003",99,2};
sort(stu,stu+n,cmp);
for(i=0;i<n;i++)
cout<<stu[i].id<<" "<<stu[i].name<<" "<<stu[i].r<<" "<<stu[i].score<<endl;
}
运行结果:
以上转载于此处,并有一些修改,非常感谢作者大大
https://blog.csdn.net/Grady_Ne/article/details/100813660
折半查找
自己写的折半查找,可以找到第一个想要的值,没找到返回-1
#include<iostream>
#include<algorithm>
using namespace std;
int a[20000];
int zheban(int u,int n)
{
int low=0,high=n,mid;
int s=0;
while(low<=high)
{
mid=(low+high)/2;
if(a[mid]>u)
{
high=mid-1;
}
if(a[mid]<u)
{
low=mid+1;
}
if(a[mid]==u)//rxjyyds!
{
high=mid-1;
s=1;
}
}
if(s==1)
return low+1;
else
return -1;
}
int main()
{
int n,i,u;
int ans;
cin>>n;
for(i=0;i<n;i++)
{
cin>>a[i];
}
cin>>u;
sort(a,a+n);
ans=zheban(u,n);
cout<<ans<<endl;
return 0;
}
rxjyyds!,如果直接return mid就只能是其中一个而不是第一个了。