排序练习2024-7-3

4087. 插入排序

第一种暴力,过13/25用例

#include<iostream>
#include<bits/stdc++.h>
using namespace std;
int n,m;
/*1 x v : 这是第一种操作,会将 a的第 x个元素,也就是 ax的值,修改为 v.保证 1≤x≤n,1≤v≤109
注意这种操作会改变数组的元素,修改得到的数组会被保留也会影响后续的操作。
2 x : 这是第二种操作,假设 H老师按照上面的伪代码对 a数组进行排序,你需要告诉 H老师原来 a
的第 x个元素,也就是 ax,在排序后的新数组所处的位置。保证 1≤x≤n.
注意这种操作不会改变数组的元素,排序后的数组不会被保留,也不会影响后续的操作。*/
class s{
    public:
  int a;
  int id;
};
bool printafter(const s s1,const s s2){
    if(s1.a!=s2.a)return s1.a<s2.a;
    return s1.id<s2.id;
}
int main(){
    cin>>n>>m;
    s b[300010];
    int op[300010];
    for(int i=1;i<=n;i++){
        int x;
        cin>>x;
        b[i].a=x;
        b[i].id=i;
    }
    sort(b+1,b+1+n,printafter);
    for(int i=1;i<=n;i++){
        op[b[i].id]=i;
    }
    for(int j=1;j<=m;j++){
        int c;
        cin>>c;
        if(c==1){
           int x1,x2;
           cin>>x1>>x2;
           int xx=b[op[x1]].a;
           b[op[x1]].a=x2;
           int yy=op[x1];
           if(xx>x2){
            sort(b+1,b+1+yy,printafter);
            for(int f=1;f<=yy;f++){
            op[b[f].id]=f;
    }
           }
           if(xx<x2){
             sort(b+yy,b+1+n,printafter);
            for(int f=yy;f<=n;f++){
            op[b[f].id]=f;
    } 
           }
         
           
          
        }
        if(c==2){
           int x1;
           cin>>x1;
           cout<<op[x1]<<endl;
           
        }
    }
    return 0;
}

 第二种,对排序进行了优化,ac

#include<iostream>
#include<bits/stdc++.h>
using namespace std;
int n,m;
/*1 x v : 这是第一种操作,会将 a的第 x个元素,也就是 ax的值,修改为 v.保证 1≤x≤n,1≤v≤109
注意这种操作会改变数组的元素,修改得到的数组会被保留也会影响后续的操作。
2 x : 这是第二种操作,假设 H老师按照上面的伪代码对 a数组进行排序,你需要告诉 H老师原来 a
的第 x个元素,也就是 ax,在排序后的新数组所处的位置。保证 1≤x≤n.
注意这种操作不会改变数组的元素,排序后的数组不会被保留,也不会影响后续的操作。*/
class s{
    public:
  int a;
  int id;
};
bool printafter(const s s1,const s s2){
    if(s1.a!=s2.a)return s1.a<s2.a;
    return s1.id<s2.id;
}
int main(){
    cin>>n>>m;
    s b[300010];
    int op[300010];
    for(int i=1;i<=n;i++){
        int x;
        cin>>x;
        b[i].a=x;
        b[i].id=i;
    }
    sort(b+1,b+1+n,printafter);
    for(int i=1;i<=n;i++){
        op[b[i].id]=i;
    }
    for(int j=1;j<=m;j++){
        int c;
        cin>>c;
        if(c==1){
           int x1,x2;
           cin>>x1>>x2;
           int xx=b[op[x1]].a;
           b[op[x1]].a=x2;
           int yy=op[x1];
           if(xx>x2){
            for(int f = op[x1];f > 1;f--)
                {
                    if((b[f].a== b[f - 1].a && b[f - 1].id < b[f].id)
                       || (b[f].a > b[f - 1].a))
                      break;
                    swap(b[f], b[f - 1]);
                    op[b[f].id] = f;
                }
            
           }
           if(xx<x2){
            for(int f = op[x1];f < n;f++)
                {
                    if(b[f + 1].a == b[f].a && b[f + 1].id > b[f].id)
                    break;
                    if(b[f + 1].a > b[f].a)
                    break;
                    swap(b[f], b[f + 1]);
                    op[b[f].id] = f;
                }
           }
         
           for(int f = 1;f <= n;f++)
            {
                op[b[f].id] = f;
            }
          
        }
        if(c==2){
           int x1;
           cin>>x1;
           cout<<op[x1]<<endl;
           
        }
    }
    return 0;
}

5332. 选择排序

#include <iostream>
#include <vector>
using namespace std;
    int n;
void selectionSort(vector<int>& arr) {
    for (int i = 0; i < n - 1; i++) {
        int min_idx = i;
        for (int j = i + 1; j < n; j++) {
            if (arr[j] < arr[min_idx]) {
                min_idx = j;
            }
        }
        swap(arr[i], arr[min_idx]);
    }
}

int main() {
    vector<int> arr;

    cin>>n;
    for(int i=0;i<n;i++){
        int x;
        cin>>x;
        arr.push_back(x);
    }
    selectionSort(arr);
    for (int i = 0; i < arr.size(); i++) {
        cout << arr[i] << " ";
    }
    cout << endl;
    return 0;
}

5334. 冒泡排序

#include <iostream>
#include <vector>
using namespace std;
int n;
void bubbleSort(vector<int>& arr) {
    for (int i = 0; i < n - 1; i++) {
        for (int j = 0; j < n - i - 1; j++) {
            if (arr[j] > arr[j + 1]) {
                swap(arr[j], arr[j + 1]);
            }
        }
    }
}

int main() {
    vector<int> arr;
    cin>>n;
    for(int i=0;i<n;i++){
        int x;
        cin>>x;
        arr.push_back(x);
    }
    bubbleSort(arr);
    for (int i = 0; i < arr.size(); i++) {
        cout << arr[i] << " ";
    }
    cout << endl;
    return 0;
}

4653. 数位排序

暴力,1/2用例

#include<iostream>
#include<bits/stdc++.h>
using namespace std;
vector<int>a;
int n,m;
bool compare(const int a,const int b){
    int a1=0,b1=0;
    int aa=a,bb=b;
    while(aa){
       a1+=aa%10;
       aa/=10;
    }
    while(bb){
       b1+=bb%10;
       bb/=10;
    }
    if(a1!=b1) return a1<b1;
    return a<b;
    
}
int main(){
    cin>>n>>m;
    for(int i=1;i<=n;i++){
        a.push_back(i);
    }
    /*for(auto i:a) cout<<i;
    cout<<endl;*/
    sort(a.begin(),a.end(),compare);
    /*for(auto i:a) cout<<i<<" ";
    cout<<endl;*/
    cout<<a[m-1];
    return 0;
}

预先处理位数:先预处理时间复杂度O(nlogn)。不先预处理排序花费的时间复杂度为O(nlogn)里面嵌套求n个数的数位和O(n),总时间复杂度为O(n*nlogn)

#include<iostream>
#include<bits/stdc++.h>
using namespace std;
int n,m;
struct node {
    int x,y;
}a[1000010];
bool compare(node a,node b){
    if(a.y!=b.y)return a.y<b.y;
    return a.x<b.x;
    
}
int main(){
    cin>>n>>m;
    for(int i=1;i<=n;i++){
      a[i].x=i;
        int t=i;
        while(t){
            a[i].y+=t%10;
            t/=10;
        }
      
    }
     
    sort(a+1,a+1+n,compare);
    cout<<a[m].x;
    return 0;
}

862. 三元组排序

#include<bits/stdc++.h>
using namespace std;
 class s{
     public:
    int x;
    string y;
    string z;
    
 };
 int n;
 bool cmp(s s1,s s2){
     return s1.x<s2.x;
 }
int main(){
    int n;
    cin>>n;
    int xx;string yy;string zz;
    vector<s>a;
    for(int i=0;i<n;i++){
        cin>>xx>>yy>>zz;
        s s1;
        s1.x=xx;
        s1.y=yy;
        s1.z=zz;
        a.push_back(s1);
        
    }
    sort(a.begin(),a.end(),cmp);
    for(auto i:a) cout<<i.x<<" "<<i.y<<" "<<i.z<<endl;
    return 0;
}

5333. 插入排序

#include<bits/stdc++.h>
using namespace std;
int n;
int a[1001];
void insertSort(int a[1001]){
    for (int i = 1; i < n; i++){
        for(int j=i;j>0;j--){
            if(a[j]<a[j-1]){
                swap(a[j],a[j-1]);
            }
        }
    }
}
int main(){
    cin>>n;
    for(int i=0;i<n;i++){
        int x;
        cin>>x;
       a[i]=x;
    }
    insertSort(a);
    for(int i=0;i<n;i++) cout<<a[i]<<" ";
    return 0;
}

 

3213. 数字排序

给定 n𝑛 个整数,请统计出每个整数出现的次数,按出现次数从多到少的顺序输出。

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

class s{
    public:
   int num;
   int id;
};
bool cmp(s s1,s s2){
    if(s1.num!=s2.num) return s1.num>s2.num;
    return s1.id<s2.id;
}
int main(){
    int n;
    cin>>n;
    s stu[1001];
    for(int i=0;i<1001;i++){
        stu[i].id=i;
        stu[i].num=0;
    }
    for(int i=0;i<n;i++){
        int x;
        cin>>x;
        stu[x].num++;
    }
    sort(stu,stu+1001,cmp);
    
    for(int i=0;i<1001;i++){
        if(stu[i].num!=0){
            cout<<stu[i].id<<" "<<stu[i].num<<endl;
        }
    }
    return 0;
}

1579. 插入还是归并

只过了6/12

 429. 奖学金

#include<bits/stdc++.h>
using namespace std;
int n;
class s{
    public:
   int c;
   int m;
   int e;
   int sum;
   int id;
};
bool cmp(s s1,s s2){
    if(s1.sum!=s2.sum) return s1.sum>s2.sum;
    else if(s1.c!=s2.c)return s1.c>s2.c;
    else return s1.id<s2.id;
}
int main(){
    cin>>n;
    vector<s>stu;
    int cc;int mm;int ee;
    for(int i=0;i<n;i++){
        s ss;
        cin>>cc>>mm>>ee;
        int su=0;
        su=cc+mm+ee;
        ss.c=cc;
        ss.m=mm;
        ss.e=ee;
        ss.id=i+1;
        ss.sum=su;
        stu.push_back(ss);
        
    }
    sort(stu.begin(),stu.end(),cmp);
    for(int i=0;i<5;i++){
        cout<<stu[i].id<<" "<<stu[i].sum<<endl;
    }
    return 0;
}

  • 5
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值