第9話 グループ分けしない場合の並び換え
今回は、
6 8 3 4 8 2
をグループに分けないで、並び換えてみましょう。
1巡目
6 8 3 4 8 2 @
6 8 3 4 8 2
6 8 3 4 8 2 A
6 3 8 4 8 2 B
6 3 8 4 8 2 C
6 3 4 8 8 2 D
6 3 4 8 8 2 E
6 3 4 8 8 2
6 3 8 4 8 2 F
6 3 8 4 2 8 G
2巡目
6 3 8 4 2 8 H
3 6 8 4 2 8 I
3 6 8 4 2 8 J
3 6 8 4 2 8
3 6 8 4 2 8 K
3 6 4 8 2 8 L
3 6 4 8 2 8 M
3 6 4 2 8 8 N
3 6 4 2 8 8 O
3巡目
3 6 4 2 8 8 P
3 6 4 2 8 8
3 6 4 2 8 8 Q
3 4 6 2 8 8 R
3 4 6 2 8 8 S
3 4 2 6 8 8 繪
3 4 2 6 8 8
3 4 2 6 8 8 繪
3 4 2 6 8 8
4巡目
3 4 2 6 8 8 繪
3 4 2 6 8 8
3 4 2 6 8 8 繪
3 2 4 6 8 8 繪
3 2 4 6 8 8 繪
3 2 4 6 8 8
3 2 4 6 8 8 繪
3 2 4 6 8 8
3 2 4 6 8 8 繪
3 2 4 6 8 8
5巡目
3 2 4 6 8 8 繪
2 3 4 6 8 8 繪
2 3 4 6 8 8 繪
2 3 4 6 8 8
2 3 4 6 8 8 繪
2 3 4 6 8 8
2 3 4 6 8 8 繪
2 3 4 6 8 8
2 3 4 6 8 8 繪
2 3 4 6 8 8
6巡目
2 3 4 6 8 8 繪
2 3 4 6 8 8
2 3 4 6 8 8 繩ア
2 3 4 6 8 8
2 3 4 6 8 8 繩イ
2 3 4 6 8 8
2 3 4 6 8 8 繩ウ
2 3 4 6 8 8
2 3 4 6 8 8 繩エ
2 3 4 6 8 8
1回も交換が発生せず、並び換え終了。
今回のステップ数は39回でした。
2グループに分けた場合が32回でしたから、
グループに分けた方がステップ数が少ないことになります。
さらに、交換になる場合、
void g(int* x){
int i,cn;
while(1){
cn=0;
for(i=0;i<9999;i++){
if(x[i]>x[i+1]){
int w;
w=x[i];
x[i]=x[i+1];
x[i+1]=w;
cn++;
}
}
if(cn==0)break;
}
}
実際には3つのステップを踏んでいますから、
交換の場合は3とカウントすべきです。
交換になった回数は、2グループの場合に6回であり、
グループに分けない場合に9回です。
ですから、正確にはステップ数は、
2グループのとき、
32−6+6×2=36
グループに分けないとき、
39−9+9×2=48
です。
並び換える個数が多いと、
思考実験も煩雑になり、行数も増えてしまいますから、
記述しませんが、
個数が多いほど、ステップ数が減ることが予想されます。
さらに、マルチスレッドの講ですでに学習しましたように、
物理CPUが4個、論理CPUが8個の場合には、
6スレッド当たりでCPU使用率が100%になりますから、
6グループに分けるのが最も効率的です。
6グループに分けて、
それぞれのグループ内の並び換えは各タスク(スレッド)に担当させれば、
並び換えのかなりの高速化が期待できます。
では、皆さんマルチスレッド化に挑戦してみて下さい。
