> 分析
>> 本题分两步
1. 计算序列的逆序数
2. 根据逆序数排序
>> 由于序列个数最大只有100个, 所以不需要过分追求速度,插入排序就够用
> 注意:
>> 存储序列的数组长度最好是50+1, 有利于输出
> 附代码
1 #include "stdio.h" 2 3 int main(void) 4 { 5 char seqs[100][50 + 1] = {0} ; 6 int inversions[100] = {0} ; 7 int sortSeqs[100] = {0} ; 8 int tmp = 0 ; 9 int seqNum = 0 ; 10 int seqLen = 0 ; 11 int i = 0, j = 0, k = 0 ; 12 int min = 0 ; 13 14 scanf("%d %d", &seqLen, &seqNum) ; 15 16 for(i = 0; i < seqNum; i++) 17 { 18 scanf("%s", seqs[i]) ; 19 20 for(j = 0; j < seqLen; j++) 21 for(k = j + 1; k < seqLen; k++) 22 { 23 if(seqs[i][k] < seqs[i][j]) 24 inversions[i]++ ; 25 } 26 27 sortSeqs[i] = i ; 28 } 29 30 /* 插入排序 */ 31 for(i = 0; i < seqNum; i++) 32 { 33 min = i ; 34 for(j = i + 1; j < seqNum; j++) 35 { 36 if(inversions[sortSeqs[j]] < inversions[sortSeqs[min]]) 37 min = j ; 38 } 39 40 tmp = sortSeqs[i] ; 41 sortSeqs[i] = sortSeqs[min] ; 42 sortSeqs[min] = tmp ; 43 } 44 45 for(i = 0; i < seqNum; i++) 46 printf("%s\r\n", seqs[sortSeqs[i]]) ; 47 48 return 0 ; 49 }
时间: 2024-10-10 13:03:59