码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2016-04-12 22:18:23      阅读:380      评论:0      收藏:0      [点我收藏+]

标签:

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; char chars[55]; }str[100]; /*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; int cnt = 0,leap = 1,sum = 0; for(i=0;i<strlen(s);i++){ for(j=i+1;j<strlen(s);j++){ if(s[j]<s[i]){ cnt++; } } sum += cnt; cnt = 0; } return sum; } int main(void){ int col,row; int i,j,k; scanf("%d %d",&col,&row); for(i=0;i<row;i++){ scanf("%s",str[i].chars);//数据输入 } for(i=0;i<row;i++){ str[i].numOfReverse = calcNumOfReverse(str[i].chars); } qsort(str,row,sizeof(str[0]),cmp); for(i=0;i<row;i++){ printf("%s\n",str[i].chars); } return 0; }

 

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

标签:

原文地址:http://www.cnblogs.com/565261641-fzh/p/5384544.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!