第12講 様々な並び替えの方法
第9話 分類法ソースコードの解説の続き

さて、前話に続いて解説を続けます。for文
          for(j=0;j<n;j++){
             if(i<3){
               if(p[j]>max-(i+1)*hb && p[j]<=max-i*hb){
                 a[i][cn[i]]=p[j];
                 cn[i]++;
               }
             if(i==3){
               if(p[j]>=max-(i+1)*hb && p[j]<=max-i*hb){
                 a[i][cn[i]]=p[j];
                 cn[i]++;
               }
             }
           }
の一巡目(i=0)で、41 67 34 0 69 24 78 58 62 64ピンクが第1群すなわちa[0][j]に分類されました。
具体的には、a[0][0]=67、a[0][1]=69、a[0][2]=78、a[0][3]=62、a[0][4]=64となったわけです。
for文の2巡目すなわちi=1では、if(p[j]>max-(i+1)*hb && p[j]<=max-i*hb)のp[j]>max-(i+1)*hb && p[j]<=max-i*hbは、
max=78でhb=19.5でしたから、78-(1+1)×19.5<p[j]≦78-1×19.5の計算から39<p[j]≦59.5となります。
41 67 34 0 69 24 78 58 62 64で該当するのは、41 67 34 0 69 24 78 58 62 64薄紺色4158です。したがって、
          for(j=0;j<n;j++){
             if(p[j]>max-(i+1)*hb && p[j]<=max-i*hb){
               a[i][cn[i]]=p[j];
               cn[i]++;
             }
           }           
によって、(cn[i]=0;からcn[1]=0であったことに注意)a[1][0]=41、cn[1]=1→a[1][1]=58となります。
for文3巡目すなわちi=2では、78-(2+1)×19.5<p[j]≦78-2×19.5の計算から19.5<p[j]≦38となります。該当するのは、
41 67 34 0 69 24 78 58 62 64紺色3424です。したがって、a[2][0]=34、a[2][1]=24となります。
for文4巡目すなわちi=3では、
            if(i==3){
               if(p[j]>=max-(i+1)*hb && p[j]<=max-i*hb){
                 a[i][cn[i]]=p[j];
                 cn[i]++;
               }
             }
が働き、78-(3+1)×19.5p[j]≦78-3×19.5(に注目)となって、0≦p[j]≦19.5となります。該当するのは、
41 67 34 0 69 24 78 58 62 64薄茶色0のみですから、a[3][0]=0となります。以上で、
        for(i=0;i<5;i++){
           cn[i]=0;
           for(j=0;j<n;j++){
             if(p[j]>max-(i+1)*hb && p[j]<=max-i*hb){
               a[i][cn[i]]=p[j];
               cn[i]++;
             }
           }
        } 
は終了となりますが、すべてが色分けすなわち分類されたことが分かります。

最後のfor文
       char ks=0;
       for(i=0;i<M;i++){
           if(cn[i]>0){
             for(j=0;j<cn[i];j++){
               p[ks]=a[i][j];
               ks++;
             }
           }
        } 
では、色分けされたデータを
67 69 78 62 64 41 58 41 34 24 0
のように並べ替えしています。トレースしてみましょう。iは群番号、jは群の中のデータ番号(0から始まる)を意味しています。
i=0では、a[0][0]=67、a[0][1]=69、a[0][2]=78、a[0][3]=62、a[0][4]=64が順に代入され、
p[0]=67、p[1]=69、p[2]=78、p[3]=62、p[4]=64となります。
i=1では、a[1][0]=41、a[1][1]=58が順に代入され、
p[5]=41、p[6]=58となります。
i=2では、a[2][0]=34、a[2][1]=24が順に代入され、
p[7]=34、p[8]=24となります。
i=3では、a[3][0]=0が代入され、
p[9]=0となります。
以上で並び替え
p[0]=67、p[1]=69、p[2]=78、p[3]=62、p[4]=64、 p[5]=41、p[6]=58 p[7]=34、p[8]=24、 p[9]=0が実現しています。

第11講第6話へ 第12講第8話へ 第12講第10話へ 第13講第1話へ




vc++講義第1部へ
vb講義へ
VB講義基礎へ
初心者のための世界で一番わかりやすいVisual Basic入門基礎講座へ
初心者のための世界で一番わかりやすいVisual C++入門基礎講座へ