排序习题练习

acwing 3638. 排序

#include<iostream>
#include<bits/stdc++.h>
using namespace std;
int n;
vector<int>j;
vector<int>o;
int main(){
    cin>>n;
    int x;
    for(int i=0;i<n;i++){
        cin>>x;
        if(x%2==0) o.push_back(x);
        else j.push_back(x);
    }
    sort(j.begin(), j.end());
    sort(o.begin(), o.end());
    for(auto i:j) cout<<i<<" ";
    for(auto i:o) cout<<i<<" ";
    return 0;
    
}

5050. 排序

#include<bits/stdc++.h>
using namespace std;
int n;
string  s;
int main(){
    cin>>n;
    for(int i=1;i<=n;i++){
        int m;
        cin>>m;
        cin>>s; 
        sort(s.begin(),s.end());
        cout<<s<<endl;
        s.clear();
    }
    return 0;
}

5372. 排序

#include<bits/stdc++.h>
using namespace std;
int main(){
    vector<int>a(3);
    int a1,a2,a3;
    cin>>a1; a[0]=a1;
     cin>>a2; a[1]=a2;
      cin>>a3; a[2]=a3;
      sort(a.begin(),a.end());
      cout<<a[0]<<" "<<a[1]<<" "<<a[2]<<endl;
      return 0;
}

3601. 成绩排序

#include<bits/stdc++.h>
using namespace std;
class stu{
public:
  string name;
  int age;
  int sore;
stu(string n,int a,int s){
      name=n;
      age=a;
      sore=s;
  }
};

// 比较函数
bool compare(const stu& a,const stu& b) {
    if (a.sore != b.sore) {
        return a.sore < b.sore; // 按成绩从低到高排序
    }
    if (a.name != b.name) {
        return a.name < b.name; // 按姓名字典序排序
    }
    return a.age < b.age; // 按年龄从小到大排序
}
int main(){
      int n;
      cin>>n;
      vector<stu>student;
      for(int i=0;i<n;i++){
          string n;
          int a;
          int s;
          cin>>n>>a>>s;
          student.push_back(stu(n, a, s));
      }
      //stu ss("qhie",12,34);
      sort(student.begin(), student.end(),compare);
      for (const auto& students : student) {
        cout << students.name << " " << students.age << " " << students.sore << endl;
    }
      return 0;
}
/*
#include<bits/stdc++.h>
using namespace std;

// 比较函数
bool compare(int a,int b) {

        return a > b; // 按成绩从低到高排序
    
}
int main(){
      int n;
      cin>>n;
      vector<int>student;
      for(int i=0;i<n;i++){
          int a;
          cin>>a;
          student.push_back(a);
          ;
      }
      sort(student.begin(), student.end(),compare);
      for (const auto& students : student) {
        cout << students << endl;
    }
      return 0;
}*/

5075. 整数排序

#include<bits/stdc++.h>
using namespace std;
vector<int>a,b,c,d,e,f,g,h,i;
int main(){
    long int aa;
    while(cin>>aa){
        if(aa/10==0&&abs(aa)-10<0){//1位数
            a.push_back(aa);
        }
        else if(aa/100==0&&abs(aa)-100<0){//2
            b.push_back(aa);
        }
        else if(aa/1000==0&&abs(aa)-1000<0){//3
            c.push_back(aa);
        }
        else if(aa/10000==0&&abs(aa)-10000<0){//4
            d.push_back(aa);
        }
        else if(aa/100000==0&&abs(aa)-100000<0){//5
            e.push_back(aa);
        }
        else if(aa/1000000==0&&abs(aa)-1000000<0){//6
            f.push_back(aa);
        }
        else if(aa/10000000==0&&abs(aa)-10000000<0){//7
            g.push_back(aa);
        }
        else if(aa/100000000==0&&abs(aa)-100000000<0){//8
            h.push_back(aa);
        }
        else if(aa/1000000000==0&&abs(aa)-1000000000<0){//9
            i.push_back(aa);
        }
        
    }
    sort(a.begin(),a.end());
    sort(b.begin(),b.end());
    sort(c.begin(),c.end());
    sort(d.begin(),d.end());
    sort(e.begin(),e.end());
    sort(f.begin(),f.end());
    sort(g.begin(),g.end());
    sort(h.begin(),h.end());
    sort(i.begin(),i.end());
if (i.size()!=0)for(auto x:i) cout<<x<<" ";
if (h.size()!=0)for(auto x:h) cout<<x<<" ";
if (g.size()!=0)for(auto x:g) cout<<x<<" ";
if (f.size()!=0)for(auto x:f) cout<<x<<" ";  
if (e.size()!=0)for(auto x:e) cout<<x<<" ";
if (d.size()!=0)for(auto x:d) cout<<x<<" ";
if (c.size()!=0)for(auto x:c) cout<<x<<" ";
if (b.size()!=0)for(auto x:b) cout<<x<<" ";
if (a.size()!=0)for(auto x:a) cout<<x<<" ";
      return 0;
}

解2

#include<bits/stdc++.h>
using namespace std;
vector<pair<int, int>> nums;
bool compare(const pair<int,int>& a,const pair<int,int>& b){
    if(a.first!=b.first) return a.first>b.first;
    return a.second<b.second;
}
int getsa(int x){
       x=abs(x);
       int s=0;
       if(x==0) return 1;
    while(x){
        s++;
        x=x/10;
    }
    return s;
}
int main(){
    int aa;
    while(cin>>aa){
        int x=getsa(aa);
        nums.push_back(make_pair(x,aa));
    }
    sort(nums.begin(),nums.end(),compare);
    for(auto i:nums) cout<<i.second<<" ";
    return 0;
}

解3,一直超时

#include <bits/stdc++.h>
using namespace std;
//获取位数
int getsa(int x){
    for(int i=1;i<=9;i++){
        x=abs(x);
        if(x/10==0) return i;
        else x=x/10;
    }
}
// 比较函数
bool compare(int a, int b) {
    // 计算两个整数的位数
    int lenA = getsa(a);
    int lenB = getsa(b);
    
    // 如果位数不同,则位数多的整数排在前面
    if (lenA != lenB) {
        return lenA > lenB;
    }
    
    // 如果位数相同,则按照整数本身由小到大排序
    return a < b;
}

int main() {
    vector<int>nums;
    int aa;
    while(cin>>aa) {
       nums.push_back(aa);
    }
    
    // 使用自定义的比较函数进行排序
    sort(nums.begin(), nums.end(), compare);
    
    // 输出排序后的整数
    for (auto i:nums) {
        cout <<i<<" ";
    }
    cout << endl;
    
    return 0;
}

1505. 列表排序,这个题一开始总是超时,是输出的原因,cout和cin比较费时

#include<iostream>
#include<bits/stdc++.h>
using namespace std;
int N,C;
/*记录包括学生 ID,一个唯一的 6
 位数字,名称,一个长度不超过 8
 的不含空格的字符串,成绩,一个范围在 [0,100]
 的整数。*/
 
class S{
public:
   string id;
   string name;
   int score;
   S(string i,string n,int s):id(i),name(n),score(s){};
};
/*如果 C=1
,则按照 ID 升序的顺序排序。

如果 C=2
,则按照名称以不降序的顺序排序。

如果 C=3
,则按照成绩以不降序的顺序排序。

当出现学生名字相同或是成绩相同的情况时,
按照 ID 升序的顺序,对他们进行排序。*/
bool compare1(const S a,const S b){
    return a.id<b.id;
}
bool compare2(const S a,const S b){
    if(a.name!=b.name) return a.name<b.name;
    return a.id<b.id;
}
bool compare3(const S a,const S b){
     if(a.score!=b.score) return a.score<b.score;
    return a.id<b.id;
}
int main(){
    cin>>N>>C;
     string id;
     string name;
     int score; 
    vector<S>stu;
   for (int i=0;i<N;i++){
    cin>>id>>name>>score;
    stu.push_back(S(id,name,score));
    }
    if(C==1) sort(stu.begin(),stu.end(),compare1);
    if(C==2) sort(stu.begin(),stu.end(),compare2);
    if(C==3) sort(stu.begin(),stu.end(),compare3);
    for(int j=0;j<N;j++)
     printf("%s %s %d\n",stu[j].id.c_str(),stu[j].name.c_str(),stu[j].score);
    return 0;
}
  
 

#include<bits/stdc++.h>
using namespace std;
int T,N;
/*每块布料包含三种属性:

颜色(C
),一个由小写英文字母组成的字符串,表示布料的颜色。
耐久性(D
),一个整数,表示布料的耐久性。
唯一标识符(U
),一个整数,表示布料的 ID
。*/

class Q{
public:
   string C;
   int D;
   int U;
   Q(string c,int d,int u):C(c),D(d),U(u){}
   
};
/*
阿达按照颜色(C
)字典序升序的顺序对布料进行排序,颜色相同的布料按唯一标识符(U
)升序的顺序进行排序。

查尔斯按照耐久性(D
)升序的顺序对布料进行排序,耐久性相同的布料按唯一标识符(U
)升序的顺序进行排序。*/
bool cmp1(const Q a,const Q b){
    if(a.C!=b.C)return a.C<b.C;
    return a.U<b.U;
}
bool cmp2(const Q a,const Q b){
    if(a.D!=b.D)return a.D<b.D;
        return a.U<b.U;
}
int main(){
   cin>>T;
string C;
   int D;
   int U;
   for(int i=0;i<T;i++){
       cin>>N;
       vector<Q> q1;
       vector<Q> q2;
       for(int j=0;j<N;j++){
           cin>>C>>D>>U;
           q1.push_back(Q(C,D,U));
            q2.push_back(Q(C,D,U));
       }
       sort(q1.begin(),q1.end(),cmp1);
       sort(q2.begin(),q2.end(),cmp2);
       int flag=0;
       for(int j=0;j<N;j++){
           if(q1[j].U==q2[j].U) flag++;
       }
       //Case #1: 5
       cout<<"Case #"<<i+1<<": "<<flag<<endl;
       q1.clear();
       q2.clear();
   }
   return 0;
}

3446. 整数奇偶排序

#include<iostream>
#include<bits/stdc++.h>
using namespace std;
int n;
vector<int>j;
vector<int>o;
bool cmp1(int a,int b){
    return a>b;
}
int main(){
int x;
    while(cin>>x){
        if(x%2==0) o.push_back(x);
        else j.push_back(x);
    }
    sort(j.begin(), j.end(),cmp1);
    sort(o.begin(), o.end());
    for(auto i:j) cout<<i<<" ";
    for(auto i:o) cout<<i<<" ";
    return 0;
    
}

 3376. 成绩排序2

#include<bits/stdc++.h>
using namespace std;
class stu{
public:

  int id;
  int sore;
stu(int a,int s){
      id=a;
      sore=s;
  }
};

// 比较函数
bool compare(const stu& a,const stu& b) {
    if (a.sore != b.sore) {
        return a.sore < b.sore; // 按成绩从低到高排序
    }
 
    return a.id < b.id; // 按xuehao从小到大排序
}
int main(){
      int n;
      cin>>n;
      vector<stu>student;
      for(int i=0;i<n;i++){
          int a;
          int s;
          cin>>a>>s;
          student.push_back(stu(a, s));
      }
      //stu ss("qhie",12,34);
      sort(student.begin(), student.end(),compare);
      for (const auto& students : student) {
        cout << students.id << " " << students.sore << endl;
    }
      return 0;
}

 

#include<bits/stdc++.h>
using namespace std;
int flag=0;
class stu{
public:
  string  name;
  int sore;
  int xx;
stu(string a,int s,int x){
      name=a;
      sore=s;
      xx=x;
  }
};
//第二行包含一个整数 0或 1,表示排序规则,0 表示从高到低,1表示从低到高。
// 比较函数
bool compare0(const stu& a,const stu& b) {
    if (a.sore != b.sore) {
        return a.sore > b.sore;
    }
 
    return a.xx < b.xx; // 按照顺序
}
// 比较函数
bool compare1(const stu& a,const stu& b) {
    if (a.sore != b.sore) {
        return a.sore < b.sore; // 按成绩从低到高排序
    }
 
    return a.xx < b.xx; // 按照顺序
}
int main(){
      int n,m;
      cin>>n>>m;
      vector<stu>student;
      for(int i=0;i<n;i++){
          string a;
          int s;
          cin>>a>>s;
          student.push_back(stu(a, s,flag));
          flag++;
      }
      //stu ss("qhie",12,34);
      if(m==0) sort(student.begin(), student.end(),compare0);
       if(m==1) sort(student.begin(), student.end(),compare1);
      for (const auto& students : student) {
        cout << students.name << " " << students.sore << endl;
    }
      return 0;
}

 

#include<bits/stdc++.h>
using namespace std;
int main(){
    set<int>x;
    int n;
    cin>>n;
    int xx;
    for(int i=0;i<n;i++){
        cin>>xx;
        x.insert(xx);
    }
    for(auto i:x) cout<<i<<" ";
    cout<<endl;
    return 0;
}

堆排序还是插入排序

/*插入排序
本质:看当前元素是否比前驱小,若小,则插到前面有序序列中。插入排序的前半部分都是有序的
后半部分是原序。所以说,b数组前半部分是有序的,无序部分应该和a中顺序是一样的
堆排序
堆是前面无序,后面有序,是>= 堆顶的元素。
所以只需从后往前看,找到< 堆顶的元素,就是分界线。然后将堆顶与堆底互换,
下坠(重新对堆排序)的同时删去堆底,堆底就在有序的序列中了。
  
*/
#include <iostream>
#include <algorithm>

using namespace std;

const int N = 110;

int a[N], b[N];
int n;

void down(int u, int size) //大根堆的下坠
{
    int t = u; //保存最大节点
    if (u*2 <= size && b[u*2] > b[t]) t = u*2; //若左孩子存在且最大,更新t
    if (u*2+1 <= size && b[u*2+1] > b[t]) t = u*2+1; //右孩子存在且最大,更新t

    if (t != u)
    {
        swap(b[u], b[t]);
        down(t, size);
    }
}

int main()
{
    cin >> n;
    for (int i = 1; i <= n; i++) cin >> a[i];
    for (int i = 1; i <= n; i++) cin >> b[i];

    //从第二个元素开始,先判断是否为插入排序
    //前面是从小到大的有序序列,后面则无序
    int p = 2; 
    while (p <= n && b[p] >= b[p-1]){ //判断前面是否有序
            p++;
        }
    int k = p; //记录p走到哪了,k 就是无序的第一个元素
    while (p <= n && a[p] == b[p]){ //判断后面是否为原序
        p++;
        
    }
    if (p == n+1) //若整个走完就是插入排序
    {
        puts("Insertion Sort");

        //执行一次插入排序,只需要将b[k]插到前面的有序序列中
        int kk=b[k];
        for(int i=k-1;i>=1;i--){
            if(kk<b[i]){
                b[i+1]=b[i];
            }
            else {
                b[i+1]=kk;
                break;
            }
        }
      /*  while (k > 1 && b[k] < b[k-1]) //当至少有一个元素存在时
            swap(b[k-1], b[k]), k--; */
    }

    else //否则为堆排序
    {
        puts("Heap Sort");
        //从末尾出发,找到堆底
        k = n;
        while (k >= 1 && b[k] >= b[1]) k--;
        swap(b[k], b[1]); //交换堆顶,堆底
        down(1, k-1); //下坠,并删去堆底
    }

for (int i = 1; i <= n; i++) cout << b[i]<<" ";
    return 0;
}


#include<iostream>
#include<bits/stdc++.h>
using namespace std;


bool Compare(char a, char b) {
    return  tolower(a) < tolower(b);
}

int main(){
    string s;
    int i=0;
  
      while(getline(cin, s)){
            string str;
        for(i=0;i<s.length();i++){
  if((s[i]>='a'&&s[i]<='z')||(s[i]>='A'&&s[i]<='Z')){
      str+=s[i];
  }
    }
    
    
   stable_sort(str.begin(),str.end(),Compare);
    int k=0;
    for(i=0;i<s.length();i++){
    
    if(isalpha(s[i])) {
        
        cout<<str[k++];
    }
    else {
      cout<<s[i]; 

    }
    }  cout << endl;
      }
   
   

    return 0;
}








评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值