第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 ②
6 3 8 4 8 2 ③
6 3 8 4 8 2 ④
6 3 4 8 8 2 ⑤
6 3 4 8 8 2 ⑥
6 3 4 8 8 2
6 3 8 4 8 2 ⑦
6 3 8 4 2 8 ⑧
2巡目
6 3 8 4 2 8 ⑨
3 6 8 4 2 8 ⑩
3 6 8 4 2 8 ⑪
3 6 8 4 2 8
3 6 8 4 2 8 ⑫
3 6 4 8 2 8 ⑬
3 6 4 8 2 8 ⑭
3 6 4 2 8 8 ⑮
3 6 4 2 8 8 ⑯
3巡目
3 6 4 2 8 8 ⑰
3 6 4 2 8 8
3 6 4 2 8 8 ⑱
3 4 6 2 8 8 ⑲
3 4 6 2 8 8 ⑳
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グループに分けて、
それぞれのグループ内の並び換えは各タスク(スレッド)に担当させれば、
並び換えのかなりの高速化が期待できます。
では、皆さんマルチスレッド化に挑戦してみて下さい。