第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の薄紺色の41、58です。したがって、
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の紺色の34、24です。したがって、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.5≦p[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++入門基礎講座へ