此程序耗費我盡3個小時之久,原因是做題前的規劃沒做好,一直沒有想到整體排序的好辦法,最后還是用了注意匹配的方法才解決了問題,我不知道為什么用冒泡不行,第一個字符串總是亂碼。我覺得整體思路還是比較清晰的,只是方法可能有點傻,效率還行。
C 編譯器 : 172K 0MS
#include <stdio.h>
#include <string.h>

typedef struct DNA


{
char str[50]; // 存儲字符串
int count[2]; // [0] [1]都存放串的逆序數
}DNA; // [1]中作為參考,用來和排序后的[0]匹配

int main()


{
int i=0,j,k=0,n,m,temp;
DNA or[100];
scanf("%d%d",&n,&m);
while (k<m) //獲得數據并求各自逆序數

{
scanf("%s",&or[k].str);
or[k].count[0]=0; // 此步不能忘
for (i=0; i<n; i++)
for (j=i+1; j<n; j++)
if (or[k].str[i] > or[k].str[j])
or[k].count[0]++;
k++;
}
for (i=0; i<m; i++)
or[i].count[1]=or[i].count[0]; // 原逆序數存放順序

for (i=1; i<m; i++) // 對于各組串的逆序數進行排序,count[0]內容已打亂

{
k=i-1;
for (j=i; j<m; j++)
if (or[j].count[0] < or[k].count[0])
k=j;
temp=or[i-1].count[0];
or[i-1].count[0]=or[k].count[0];
or[k].count[0]=temp;
} // 這是典型的選擇排序,只是對[0]單元的處理,穩定與否沒關系

for (i=0; i<m; i++)
for (j=0; j<m; j++)
if (or[i].count[0] == or[j].count[1]) // [0] 和 [1] 中逐一相比較

{
or[j].count[1]=-1; // 此步是相等時順序不變的保證,相當于做了訪問標記!
printf("%s\n",or[j].str);
}

return 0;
}