计算机考研机试指南(一)

版权声明:沉迷代码,难以自拔 https://blog.csdn.net/qq_33846054/article/details/79514127

编程笔记 cha 2-1 排序

排序算法

1. 排序(牛客网)

#include <iostream>
#include <algorithm>
using namespace std;
/*
    题目:排序
    思路:1--n冒泡排序、选择排序、快排
*/
void bubbleSort(int a[],int n){
    int t;
    for (int i=0;i<n-1;i++){
        for (int j=0;j<n-i-1;j++){
            if (a[j]>a[j+1]){
                t = a[j];
                a[j] = a[j+1];
                a[j+1] = t;
            }
        }
    }
}
void selectSort(int a[],int n){
    int k,t;
    for (int i=0;i<n-1;i++){
        k = i;
        for (int j=i+1;j<n;j++){
            if (a[j]<a[k]){
                k = j;
            }
        }
        if (k!=i){
            t = a[k];
            a[k] = a[i];
            a[i] = t;
        }
    }
}
void Qsort(int a[],int low,int high){
    if (low >= high)
        return;

    int first = low ;
    int last = high ;
    int key = a[first];
    while (first < last){
        while (first < last && a[last] >= key){
            --last; // last先减一,再与first比较
        }
        a[first] = a[last];
        while (first < last && a[first] <= key){
            ++first;
        }
        a[last] = a[first];
    }
    a[first]=key; // 交换过程中key并没有交换,此时first/last之前的比key小,之后的比key大,递归调用
    Qsort(a,low,first-1);
    Qsort(a,first+1,high);

}
bool cmp(int x,int y){
    return x>y;
}
void print(int a[],int n){
    for (int i=0;i<n;i++)
        cout << a[i] << ' ';
    cout<<endl;
}
int main()
{
    int n,a[101];
    while (cin >> n){
        for (int i=0;i<n;i++)
            cin >> a[i];
        //bubbleSort(a,n);
        //selectSort(a,n);
        //sort(a,a+n);//内置快排升序算法,推荐使用
        //sort(a,a+n,cmp);重载降序
        Qsort(a,0,n-1);
        print(a,n);

    }
    return 0;
}

2.成绩排序

#include <iostream>
#include <algorithm>
#include <string.h>
using namespace std;
/*
    题目:成绩排序
    思路:内置排序函数+重构cmp
*/
struct Stu{
    char name[100];
    // string name;
    int age;
    int grade;
};
bool cmp(Stu s1,Stu s2){
    if (s1.grade != s2.grade)
        return s1.grade < s2.grade;//成绩低的在前面
    int tmp = strcmp(s1.name,s2.name);
    // int tmp = s1.name - s2.name;
    if (tmp != 0)
        return tmp < 0; // 字典序小的在前面
    return s1.age < s2.age;
}
void print(Stu s[],int n){
    for (int i=0;i<n;i++)
        cout << s[i].name << ' '<<s[i].age<<' '<<s[i].grade<<endl;

}
int main()
{
    int n;
    Stu s[1001];
    while (cin >> n){
        for (int i=0;i<n;i++)
            cin >> s[i].name>>s[i].age>>s[i].grade;
        sort(s,s+n,cmp);
        print(s,n);
    }


    return 0;
}

特殊排序

#include <iostream>
#include <algorithm>
#include <string.h>
using namespace std;
/*
    题目:特殊排序
    思路:内置排序函数+重构cmp
*/

void print(int a[],int n){
    cout<<a[n-1]<<endl;
    if (n!=1){
        for (int i=0;i<n-2;i++)
            cout << a[i] << ' ';
        cout <<a[n-2]<<endl;
        // 提示格式错误:最后一个数后面没有空格
    }
    else{
        cout<<-1<<endl;
    }
}
int main()
{
    int n,a[1001];
    while (cin >> n){
        for (int i=0;i<n;i++)
            cin >> a[i];
        sort(a,a+n);
        print(a,n);
    }


    return 0;
}

EXCEL排序

#include <iostream>
#include <algorithm>
#include <string.h>
using namespace std;
/*
    题目:EXCEL排序
    遇到的问题:定义number和name同时为char类型时,在一行内输入“010000 ack 30 ”时空格
    会被视为字符串内的一个字符,因此连续cin多个字符串时应当用回车来分离字符串。
    这里审题不清:将number定义为整数够用。

    报错:编译错误:
    error: control may reach end of non-void function [-Werror,-Wreturn-type]
    原因:某些测试条件下函数没有响应的返回

    输出int number时为了变成‘000001’的6位形式需加上my_itoa()函数
    
    当number和name都是char[]类型时的另一种输入方法:
    scanf("%s %s %d",buf[i].num,buf[i].name,&buf[i].score);
*/
struct Stu{
    int number;
    char name[8];
    int grade;
}student[100000];
int c;
/*
替代写法:
 cout << setw(6) << setfill('0') << list[i].num << " ";
 setw设置输出宽度为6位
 除去输出数据num所占位数外其余填充fill0 
*/
char *my_itoa(int n)
{
    static char str[7];
    int i;
    for(i=0;i<6;i++)
        str[i]='0';
    str[7]='\0';
    i=5;
    while(n)
    {
        str[i--]=n%10 + '0';
        n/=10;
    }
    return str;
}
bool cmp(Stu a,Stu b)
{
    switch(c)
    {
    case 1:return a.number<b.number;
    case 2:
        if (strcmp(a.name,b.name)==0)
            return a.number-b.number<0;
        else
            return strcmp(a.name,b.name)<=0;
    case 3:
        if (a.grade==b.grade)
            return a.number<b.number;
        else
            return a.grade<=b.grade;
    default:return 0;
    }
}
    
/*
cmp函数的另一种写法:


bool cmp1(stu a, stu b) {
 
    return a.num < b.num; // 递增,当a<b时返回真
 
}
 
bool cmp2(stu a, stu b) {
 
    return a.name <= b.name;// 非递减 
 
}
 
bool cmp3(stu a, stu b) {
 
    if (a.grade != b.grade) {
 
        return a.grade <= b.grade; // 非递减 
 
    }
 
    else {
 
        return a.num < b.num;
 
    }
 
}
*/
void print(int n)
{
    cout<<"Case:"<<endl;
    for (int i=0;i<n;i++)
    {
        cout<<my_itoa(student[i].number)<<" "<<student[i].name<<" "<<student[i].grade<<endl;
    }
}
int main()
{

    int n;
    while (cin>>n)
    {
        cin>>c;
        for (int i=0;i<n;i++)
        {
            cin>>student[i].number;
            cin>>student[i].name;
            cin>>student[i].grade;
        }
        sort(student,student+n,cmp);
        print(n);

    }




    return 0;
}

字符串排序

#include <iostream>
#include <algorithm>
#include <string.h>
#include <stdio.h>
using namespace std;
/*
    题目:字符串内排序
	思路:字符串相当于一个数组,字母本质是个整数,所以用sort()配合strlen()求出字符串长度绰绰有余啦。
*/
int main()
{
    char str[200];
    while (scanf("%s",str)!=EOF)
    {
        sort(str,str+strlen(str));
        cout<<str<<endl;
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_33846054/article/details/79514127
今日推荐