第21講 並び換え

第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グループに分けて、
それぞれのグループ内の並び換えは各タスク(スレッド)に担当させれば、
並び換えのかなりの高速化が期待できます。
では、皆さんマルチスレッド化に挑戦してみて下さい。


第8話へ 第10話へ

a

eclipse c++ 入門講義第1部へ

eclipse c++ 入門講義第2部へ


魔方陣 数独で学ぶ VBA 入門
数独のシンプルな解き方・簡単な解法の研究
VB講義へ
VB講義基礎へ
初心者のための世界で一番わかりやすいVisual C++入門基礎講座
初心者のための世界で一番わかりやすいVisual Basic入門基礎講座
初心者のための世界で一番わかりやすいVBA入門講義(基礎から応用まで)
初心者のための VC++による C言語 C++ 入門 基礎から応用まで第1部
eclipse java 入門
java 入門 サイト 基礎から応用まで
VC++ C言語 C++ 入門 初心者 基礎から応用まで
本サイトトップへ