一种度量序列的“无序度”的方法是计算序列中的逆序元素对的数目。比如,对字母序列“DAABEC”来说,“无序度”为5,因为“D”的右边有4个字母比D“小”(即在字母表中应该排在D前面),“E”的右边有1个字母比E小。相应地,序列“AACEDGG”的无序度为1(只有“E”和“D”为逆序元素对)“ZWQM”的无序度为6。
你的任务是对一些DNA的字母序列按无序度进行排序(DNA字母序列只含A T G C四种字母),无序度小的序列排在前面。
输入
输入由多组测试数据组成。每组测试数据的第一行为两个数n和m,0<n<=50,0<m<=100。n表示每个序列的长度(同一组测试数据中各序列的长度都为n),m表示此组测试数据中的序列个数。接下来有m行,每行为一个长度为n的DNA字母序列。
输出
对于每组测试数据,输出排序后的序列列表。在排序时,无序度小的序列排在前面。如果两个序列的无序度相等,那么它们在列表中出现的顺序和它们在输入中的顺序相同。
在每组测试数据后输出一行“********************”(二十个星号)。
输入示例
3 3 ACG CGT AGT 6 2 TAAAAA ATAAAA
输出示例
ACG CGT AGT ******************** ATAAAA TAAAAA ********************
#include <stdio.h>
#include <string.h>
int main() {
int n, m,i,j,k;
char z[102][52] = {0};
int sum[102] = {0};
while(scanf("%d %d",&n,&m)==2){//读入两个整数
for ( i = 0; i < m; i++) {
scanf("%s", z[i]);
int count = 0;
for (j = 0; j < n - 1; j++) {
for (k = j + 1; k < n; k++) {
if (z[i][j] > z[i][k]) {
count++; // 计算无序度
}
}
}
sum[i] = count; //记录无序度
}
for (i = 0; i < m - 1; i++) {
for ( j = 0; j < m - 1 - i; j++) {
if (sum[j] > sum[j + 1]) {
// 通过无序度从小到大排序,交换字符串
char tempStr[52];
strcpy(tempStr, z[j]);
strcpy(z[j], z[j + 1]);
strcpy(z[j + 1], tempStr);
}
}
}
for (i = 0; i < m; i++) {
printf("%s\n", z[i]);
}
printf("********************\n");
}
return 0;
}