大二算法期末复习-排序-英文姓名排序

英文姓名排序

Time Limit: 1000/1000MS (C++/Others) Memory Limit: 65536/65536KB (C++/Others)

Problem Description

在汉语里,对汉语姓名可以按拼音排序,也可以按笔画顺序排序。在英语里,对英语姓名主要按字母顺序排序。本题要求给定的一组英文姓名按长短顺序排序。

Input

输入文件中包含多个测试数据。每个测试数据的第1行是一个正整数N(0 < N < 100),表示该测试数据中英文姓名的数目;接下来有N行,每行为一个英文姓名,姓名中允许出现的字符有大小写英文字母、空格和点号(.),每个英文姓名长度至少为2、但不超过50.N=0表示输入结束。

Output

对输入文件中的每个测试数据,输出排序后的姓名。排序方法为:先按姓名长度从长到短的顺序排序,对长度相同的姓名,则按字母顺序排序。每2个测试数据的输出之间输出一个空行。

 


用qsort先长度后字母顺序进行排序,必须考虑如果str.length()<2 时要舍弃数据,因为这个坑WA了好多发


//#include<bits/stdc++.h>
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
using namespace std;
 
struct zzj{
    char str[55];
    int length(){
        int pos = 0;
        while(this->str[pos++]!='\0');
        return pos-1;
    }
};
 
int cmp(const void *a,const void *b){
    zzj *p1 = (zzj *)a;
    zzj *p2 = (zzj *)b;
    if(p2->length() == p1->length())
        return strcmp(p1->str,p2->str);
    else
        return p2->length()-p1->length();
}
 
zzj name[105];
int main()
{
	int i,n;
	while(cin>>n && n != 0){
        getchar();
        memset(name,'\0',sizeof(name));
        for(i = 0;i < n;i++){
            cin.getline(name[i].str,55);
//            cout<<name[i].length()<<endl;
            if(name[i].length()<2){//这个题巨他妈坑,必须排除length不足2的情况
//                cout<<"no"<<endl;
                i--;
            }
        }
        qsort(name,n,sizeof(name[0]),cmp);
        for(i = 0;i <n;i++)
            cout<<name[i].str<<endl;
        cout<<endl;
	}
    return 0;
}

 


版权声明:本文为qq_40737057原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。