排序算法上机题


简单排序。内嵌一个sort函数,不需要写,但是需要c++调用头文件
在这里插入图片描述


#include <iostream>
#include "algorithm"
using namespace std;

const int MAXN=1000;
int arr[MAXN];



int main() {
  int  n;
    while (scanf("%d",&n)!=EOF){
        for (int i = 0; i <n ; ++i) {
            scanf("%d",&arr[i]);
        }
        sort(arr,arr+n);//一个个是其实地址,第二个参数是终止地址。集成了快速排序的算法
        for (int i = 0; i <n ; ++i) {
            printf("%d\n",arr[i]);
        }
    }
    return 0;
}

在这里插入图片描述

在这里插入图片描述


#include <iostream>
#include "algorithm"//使用sort函数一定要加这个
using namespace std;

const int MAXN=1000;
int arr[MAXN];

struct student{
    int code;
    int number;
};
    student arry[100];
    bool comper(student x,student y){
        if (x.code==y.code){
            return x.number<y.number;//这里表示返回学号小的,就是说学号小的排前面
        } else{
            return x.code<y.code;//这里表示返回成绩小的
        }
    }
int main() {
    int n;
    scanf("%d",&n);
    for (int i = 0; i <n ; ++i) {
        scanf("%d %d",&arry[i].number,&arry[i].code);
    }
    sort(arry ,arry+n,comper);
    for (int i = 0; i <n ; ++i) {
        printf("%d %d\n",arry[i].number,arry[i].code);
    }
    return 0;
}


在这里插入图片描述
两个数组拼接的方法


#include <iostream>
#include "algorithm"
using namespace std;

bool comper(int x,int y ){
       return x>y;
   }
int main() {
    int n=10;
    int host[10];
    for (int i = 0; i <n ; ++i) {
        scanf("%d",&host[i]);
    }
    int JS=0;
    int OS=0;//记录奇数与偶数个数
    int jishu[10];
    int oushu[10];
    for (int i = 0; i < n; ++i) {
        if (host[i]%2==0){//偶数
            oushu[OS]=host[i];
            OS++;
        } else{
            jishu[JS]=host[i];
            JS++;
        }
    }
    sort(jishu,jishu+JS,comper);
    sort(oushu,oushu+OS);

    int k;//利用k来做导向
    for (k=0;k< JS;k++) {
        host[k]=jishu[k];
    }
    for (int i = 0; i < OS; ++i) {
        host[k]=oushu[i];
        k++;
    }
    for (int i = 0; i < n; ++i) {
        printf("%d ",host[i]);
    }


    return 0;
}


#include <iostream>
#include "algorithm"
using namespace std;

const int MAXN=1000;
int arr[MAXN];

struct student{
    int code;
    int number;
};
    student arry[100];
   /* bool comper(student x,student y){
        if (x.code==y.code){
            return x.number<y.number;
        } else{
            return x.code<y.code;
        }
    }*/
   bool comper(int x,int y ){
       if (x%2==1&&y%2==1){
           return x>y;//都是奇数的话,以大到小的方式
       } else if (x%2==0&&y%2==0){
           return  x<y;//都是偶数的话,以小到大的方式
       }else if (x%2==1&&y%2==0){
           return true;//x是奇数,y是偶数的话。那么x排在前面(true)就是表示小到大排序
       } else return false;//x是偶数的话,x就排在后面

   }

int main() {
    int n=10;
    int host[10];
    for (int i = 0; i <n ; ++i) {
        scanf("%d",&host[i]);
    }
    sort(host,host+n, comper);
    for (int i = 0; i <n ; ++i) {
        printf("%d ",host[i]);
    }


    return 0;
}

在这里插入图片描述——————————————————————————————————————在这里插入图片描述
在这里插入图片描述
————————————————————————————————————————
逆序数

#include <iostream>
using namespace std;

const int MAXN=1000;
int temp[MAXN];
int aryy[MAXN];
int number=0;
int guibing( int left,int middle,int right){
    int i=left;
    int j=middle+1;
    int k=left;
    while (i<=middle&&j<=right){

       for(k=left;k<=right;k++){
           temp[k]=aryy[k];
       }
        for (k=i;i<=middle&&j<=right;k++){
            if(temp[i]<= temp[j])
                aryy[k]=temp[i++];
            else{
                aryy[k]=temp[j++];
                number=number+middle+1-i;//这里是最重要的逆序数计算公式
            }

        }
        while (i<=middle) aryy[k++]=temp[i++];
        while (j<=right) aryy[k++]=temp[j++];
    }


}


int merge(int left,int right){
    if (left<right){
        int middle=(left+right)/2;
        merge(left,middle);
        merge(middle+1,right);
        guibing(left,middle,right);
    }

}

int main() {
    int n;
    scanf("%d",&n);
    for (int i = 0; i <n ; ++i) {
        scanf("%d",&aryy[i]);
    }
    merge(0,n-1);
    for (int i = 0; i <n ; ++i) {
        printf("%d",aryy[i]);
    }
    printf("\n%d",number);

    return 0;

}

在这里插入图片描述
在这里插入图片描述
第二题逆序数
——————————————————————————————————————————————————
在这里插入图片描述
在这里插入图片描述

#include <iostream>
using namespace std;

const int MAXN=1000;
int temp[MAXN];
int aryy[MAXN];
int number=0;
int guibing( int left,int middle,int right){//
    int i=left;
    int j=middle+1;
    int k=left;
    while (i<=middle&&j<=right){

       for(k=left;k<=right;k++){
           temp[k]=aryy[k];
       }
        for (k=i;i<=middle&&j<=right;k++){
            if(temp[i]<= temp[j])
                aryy[k]=temp[i++];
            else{
                aryy[k]=temp[j++];
                number=number+middle+1-i;//逆序数计算,最重要
            }

        }
        while (i<=middle) aryy[k++]=temp[i++];
        while (j<=right) aryy[k++]=temp[j++];
    }


}


int merge(int left,int right){
    if (left<right){
        int middle=(left+right)/2;
        merge(left,middle);
        merge(middle+1,right);
        guibing(left,middle,right);
    }

}

int main() {
    int order;
    scanf("%d",&order);
    for(int ordernum=1;ordernum<=order;ordernum++) {//就在这层多了一个for循环一个大数组而已
        int n;
        scanf("%d", &n);
        for (int i = 0; i < n; ++i) {
            scanf("%d", &aryy[i]);
        }
        merge(0, n - 1);
        /*for (int i = 0; i < n; ++i) {
            printf("%d", aryy[i]);
        }*/
        printf("Scenari#%d",ordernum);
        printf("\n%d", number);
    }

    return 0;

}

在这里插入图片描述
这里采用了nlogn的大小,先排序再找a[n-k]
在这里插入图片描述
在这里插入图片描述

#include <iostream>
using namespace std;

const int MAXN=1000;
int temp[MAXN];
int aryy[MAXN];
int number=0;
int guibing( int left,int middle,int right){
    int i=left;
    int j=middle+1;
    int k=left;
    while (i<=middle&&j<=right){
       for(k=left;k<=right;k++){
           temp[k]=aryy[k];
       }
        for (k=i;i<=middle&&j<=right;k++){
            if(temp[i]<= temp[j])
                aryy[k]=temp[i++];
            else{
                aryy[k]=temp[j++];
                number=number+middle+1-i;//逆序数计算,最重要
            }
        }
        while (i<=middle) aryy[k++]=temp[i++];
        while (j<=right) aryy[k++]=temp[j++];
    }
}


int merge(int left,int right){
    if (left<right){
        int middle=(left+right)/2;
        merge(left,middle);
        merge(middle+1,right);
        guibing(left,middle,right);
    }

}
int partition(int left,int right){
    int temp=aryy[left];
    if (left<right){
        while (left<right&&aryy[right]>=temp){
           right--;
        }aryy[left]=aryy[right];
        while (left<right&&aryy[left]<=temp){
            left++;
        }aryy[right]=aryy[left];
    }
    aryy[left]=temp;
    return left;
}

/*void QSort(int left,int right){//这个是原版
    if (left<right){
        int pivot= partition(left,right);
        QSort(left,pivot-1);
        QSort(pivot+1,right);
    }
}*/
int QSort(int left,int right,int p){//p需要求哪个位置
    if (left<right){
        int privot= partition(left,right);
        if (privot>p){//向左边找
            return QSort(left,privot-1,p);
        } else if (privot<p){
            return QSort(privot+1,right,p);
        } else
            return aryy[privot];


    }
}
int main() {
    int n;
    int k;
    scanf("%d %d",&n,&k);
    for(int i=0;i<n;i++){
        scanf("%d",&aryy[i]);
    }
   int  anser=QSort(0,n-1,n-k);
    for(int i=0;i<n;i++){
        printf("%d ",aryy[i]);
    }

   // printf("\n%d",aryy[n-k]);//输出第k大
    printf("\n%d",anser);
    return 0;

}

冒泡算法


#include <iostream>
using namespace std;

const int MAXN=1000;
int arr[MAXN];


void bubble_sort(int len) {
    int i, j, temp;
    for (i = 0; i < len - 1; i++)
        for (j = 0; j < len - 1 - i; j++)//要注意这里是lent-1-i;
            if (arr[j] > arr[j + 1]) {
                temp = arr[j];
                arr[j] = arr[j + 1];
                arr[j + 1] = temp;
            }
}

int main() {
    int n;
    int  i ;
    scanf("%d",&n);
    for ( i = 0; i <n ; ++i) {
        scanf("%d",&arr[i]);
    }
    bubble_sort(n);
    for ( i=0;i<n;i++){
        printf("%d ",arr[i]);
    }
    return 0;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值