使用qsort对结构体的数据排序

时间:2021-05-15 16:42:42

1007 DNA 排序

题目大意:

序列“未排序程度”的一个计算方式是元素乱序的元素对个数。例如:在单词序列“DAABEC'”中,因为D大于右边四个单词,E大于C,所以计算结果为5。这种计算方法称为序列的逆序数。序列“AACEDGG”逆序数为1(E与D)——近似排序,而序列``ZWQM'' 逆序数为6(它是已排序序列的反序)。

你的任务是分类DNA字符串(只有ACGT四个字符)。但是你分类它们的方法不是字典序,而是逆序数,排序程度从好到差。所有字符串长度相同。

输入:

第一行包含两个数:一个正整数n(0<n<=50)表示字符串长度,一个正整数m(0<m<=100)表示字符串个数。接下来m行,每行一个长度为n的字符串。

输出:

输出输入字符串列表,按排序程度从好到差。如果逆序数相同,就原来顺序输出。

样例输入:

10 6

AACATGAAGG

TTTTGGCCAA

TTTGGCCAAA

GATCAGATTT

CCCGGGGGGA

ATCGATGCAT

样例输出:

CCCGGGGGGA

AACATGAAGG

GATCAGATTT

ATCGATGCAT

TTTTGGCCAA

TTTGGCCAAA

#include<iostream>
using namespace std;
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
/*使用结构体存储字符串和对应的逆序数。
如果把字符串和逆序数分开,排序之后字符串和逆序数将会无法对应*/
struct String{
    int numOfReverse;
    ];
}str[];
/*qsort的cmp函数参数默认为:const void *p,const void *q;数据类型不能改变。在赋值之前要对指针进行强制类型转换。*/
int cmp(const void *p,const void *q){
    String a = *(String *)p;
    String b = *(String *)q;
    return (a.numOfReverse - b.numOfReverse);
}

int calcNumOfReverse(char *s){
    int i,j;
    ,leap = ,sum = ;
    ;i<strlen(s);i++){
        ;j<strlen(s);j++){
            if(s[j]<s[i]){
                cnt++;
            }
        }
        sum += cnt;
        cnt = ;
    }
    return sum;
}
int main(void){
    int col,row;
    int i,j,k;
    scanf("%d %d",&col,&row);
    ;i<row;i++){
        scanf("%s",str[i].chars);//数据输入
    }
    ;i<row;i++){
        str[i].numOfReverse = calcNumOfReverse(str[i].chars);
    }
    qsort(str,row,]),cmp);
    ;i<row;i++){
        printf("%s\n",str[i].chars);
    }
    ;
}