C/400

57. C400 におけるソートのテクニック(1)

C 言語における文字列の分類ソート(SORT) のテクニックを紹介する。
最初に古典的な SORT のテクニックではあるが長さの異なる文字列を SORT するのに向いている手法を紹介する。

0001.00 #include <stdio.h>                                           
0002.00 #include <stdlib.h>                                          
0003.00 #include <string.h>                                          
0004.00                                                              
0005.00 #define TRUE         0                                       
0006.00 #define FALSE       -1                                       
0007.00                                                              
0008.00 void main(void){                                             
0009.00   int i, len, pass, size;                                    
0010.00   char ary[3][5], name[5], hold[5];                          
0011.00                                                              
0012.00   printf("** TESTSORT **\n");                                
0013.00   getchar();                                                 
0014.00   memset(ary, 0, sizeof(ary));                               
0015.00   strcpy(ary[0], "A002");                                    
0016.00   strcpy(ary[1], "A003");                                    
0017.00   strcpy(ary[2], "A001");                                    
0018.00                                                              
0019.00    size = 4;                                                 
0020.00    for(pass = 1; pass<=size-1; pass++){/*for-loop*/          
0021.00      for(i = 0; i<=size-2; i++){/*sub-loop*/                 
0022.00        len = strlen(ary[i]);                                 
0023.00        if(strncmp(ary[i], ary[i+1], len) > 0){/* 交換 */     
0024.00          len = strlen(ary[i]);                
0025.00          memcpy(hold, ary[i], len);           
0026.00          hold[len] = 0x00;                    
0027.00          len = strlen(ary[i+1]);              
0028.00          memcpy(ary[i], ary[i+1], len);       
0029.00          ary[i][len] = 0x00;                  
0030.00          len = strlen(hold);                  
0031.00          memcpy(ary[i+1], hold, len);         
0032.00          ary[i+1][len] = 0x00;                
0033.00        }/* 交換 */                            
0034.00      }/*sub-loop*/                            
0035.00    }/*for-loop*/                              
0036.00                                               
0037.00   for(i = 0; i<3; i++){                       
0038.00     memcpy(name, ary[i], 4);                  
0039.00     name[4] = 0x00;                           
0040.00     printf("ary[%d] = %s\n", i, name);        
0041.00   }                                           
0042.00   getchar();                                  
【 解説 】

上記で ステートメント 19行目から 35行目で SORT を行っている。
変数 size とは SORT の対象となる項目の数 + 1 の値である。
この SORT のテクニックは文字列を比較しての交換手法で行っているので、
SORT の対象となる各項目の長さが異なっている場合でも有効に働く。
IFS のディレクトリーの一覧表を出力したい場合に、IFS を API で読み取っても実は
アルファベット順には並ばない。
しかしディレクトリーやファイル名がアルファベット順に並んでいないと非常に
見づらくなってしまう。
eStudio の IFS タブをクリックして一覧表示を行うと次の画面のように IFS の一覧が表示され
編集することもできるが、ここには上記の SORT のテクニックを使って
ディレクトリーやファイル名がアルファベット順に並ぶよう設計されている。

eStudio5.1 IFS