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

来源:互联网 发布:注销阿里云 编辑:程序博客网 时间:2024/06/06 15:01

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[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;}
阅读全文
0 0
原创粉丝点击