您的位置:首页 > 理论基础 > 数据结构算法

数据结构总结之sort(排序)

2017-12-16 10:51 190 查看
1.反转int数组:

void g(int t)//反转从第一个到第t个数
{
for(int i=0; i<(n-t+1)/2; i++)
swap(a[i],a[n-i-t]);
}


2.输入的int数组不知道元素个数,用vector+getchar()

#include <bits/stdc++.h>
using namespace std;
vector<int> v;
int n;
int main()
{
int tmp;
while(~scanf("%d",&tmp))
{
v.push_back(tmp);
cout<<tmp;
while(getchar()==' ')
{
scanf("%d",&tmp);
v.push_back(tmp);
cout<<' '<<tmp;
}
n=v.size();
cout<<endl<<"元素个数:"<<n<<endl;
v.clear();
}
return 0;
}


3.next_permutation生成由当前字符组成的比当前字符串略大的字符串赋值给当前字符串,有点绕口哈!若失败,返回false。

#include <bits/stdc++.h>
using namespace std;
int main()
{
string s;
while(cin>>s)
{
if(s=="#") break;
int n=(int)s.length();
if(next_permutation(s.begin(),s.begin()+n))
cout<<s<<endl;
else
cout<<"No Successor"<<endl;
}
}


输入:

abaabc

输出:

abaacb

ababac

4.求逆序数&&归并排序

#include <iostream>
#include <stdio.h>
//error: reference to 'left' is ambiguous|把left换成left_就好了
using namespace std;
const int maxn=500010;
const int INF=0x7fffffff;
int s[maxn],left_[maxn],right_[maxn];
long long ans;
void compute(int l,int r)
{
int mid=(l+r)/2;
int left__len=mid-l+1;
int right__len=r-mid;//不可以化简成(r-l)/2,建议还是写成r-mid
int i;
for( i=1; i<=left__len; i++) left_[i]=s[l+i-1];
left_[i]=INF;//设置无穷上界,避免比较大小时越界
for( i=1; i<=right__len; i++) right_[i]=s[l+left__len+i-1];
right_[i]=INF;//设置无穷上界,避免比较大小时越界
i=1;
int j=1;
for(int k=l; k<=r;)
{
if(left_[i]<=right_[j]) s[k++]=left_[i++];
else
{
s[k++]=right_[j++];
ans+=left__len-i+1;//left_数组中,if(left_[i]<=right_[j]),left_[i+t]都是小于right_[j]的(t=1,2,3……)
}
}
}
void mergesort(int l,int r)
{
if(l<r)
{
int mid=(l+r)/2;//一般左边的长度>=右边的
mergesort(l,mid);
mergesort(mid+1,r);
compute(l,r);
}
}
int main()
{
int n;
while(~scanf("%d",&n)&&n)
{
for(int i=1; i<=n; i++) scanf("%d",&s[i]);
ans=0;
mergesort(1,n);
printf("%lld\n",ans);
}
}


5.结构体的比较大小

#include <bits/stdc++.h>
using namespace std;
string s;
struct ch
{
char c;
int cnt;
bool operator <(const ch tmp)const
{
if(tmp.cnt==cnt) return tmp.c>c;
return cnt>tmp.cnt;
}
}c[26];
int main()
{
int n;
scanf("%d",&n);getchar();
for(int i=0;i<26;i++)
{
c[i].c=(char)(i+'A');
c[i].cnt=0;
}
while(n--)
{
getline(cin,s);
for(int i=s.length()-1;i>=0;i--)
{
if(s[i]<='z' && s[i]>='a')
{
c[s[i]-'a'].cnt++;
}
else if(s[i]<='Z' && s
4000
[i]>='A')
c[s[i]-'A'].cnt++;
}
}
sort(c,c+26);

for(int i=0;i<26;i++)
{
if(c[i].cnt!=0)
cout<<c[i].c<<" "<<c[i].cnt<<endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: