// ■非再帰マージソフト // 通常のマージソフトは再帰的呼び出しで定義されるが、 // 再帰的呼び出しの部分を省略し、繰り返しで表現する方法。 // // |□|□|□|□|□|□|□|□|□|□|□|□|□|□|□|□|(1個毎の比較) //   | ↓ | ↓ | ↓ | ↓ | ↓ | ↓ | ↓ | ↓ | // |□□ |□□ |□□ |□□ |□□ |□□ |□□ |□□ |(2個ずつマージ) //    | ↓ | ↓ | ↓ | ↓ | // | □□□□ | □□□□ | □□□□ | □□□□ |(4個ずつマージ) //    | ↓ | ↓ | // | □□□□□□□□ | □□□□□□□□ |(8個ずつマージ) //    |  ↓ | // | □□□□□□□□□□□□□□□□ |(ソート完了) // // なおデータ数は 2^n個とは限らないので、データ数との比較を行い、 // データ数を超える部分の処理を取りやめる判断を行う。 // //     | | | //     | (2^n個) | (2^n個) | //     | | | // 処理済み→+←-- 範囲1 --→+←-- 範囲2 --→+→次回の対象 //     | | | //     |N0 i1 |N1 i2 |N2 //   |↓  ↓    |↓ ↓ |↓ // ■■■■■□□□□□□□□□□□□□□□□■■■■■ // / // @ マージ数=1,入力側 = 0,出力側 = 1とする。 // A マージ範囲 N0, N1, N2を設定。 // B 上記においてN0≦i1<N1,N1≦i2<N2として //   tmp[k1][i1]とtmp[k1][i2]を比較して //   小さい方をtmp[k2][j]に移す。なおN0≦j<N2となる。 // C i2≧N2となったらi1側の残りを作業域側に移して次のマージへ。 // i1≧N1となったらi2側の残りを作業域側に移して次のマージへ 。 // D N0=N2として新しいマージ範囲を設定してB以降を繰り返す。 // E N0がデータ数より大きくなったら // 入力側と出力側を交換してマージ数を2倍にしてA以降を繰り返す。 // #include "stdio.h" #include "stdlib.h" #include "time.h" #define DATALENGTH 10 //データ数 #define frand()((double)rand()/(RAND_MAX+1)) // 0〜1の間の乱数 int Data[DATALENGTH]; // ソート対象データ void initArray(){// ソート対象データの生成(10 〜 99) for(int i=0;i=データ数であればN0〜N1までを複写してbreak if(N1 >= DATALENGTH){j = arrayMove(tmp, k1, k2, j, N0, DATALENGTH);break;} N2=N1+step; if(N2 > DATALENGTH) N2 = DATALENGTH;// N2>データ数のときN2=データ数 int i1=N0, i2=N1;// i1=N0, i2=N1としてマージ開始 while(i1=N2){j = arrayMove(tmp, k1, k2, j, i1, N1);break;}//i1側を複写して次へ if(tmp[k1][i1]>tmp[k1][i2]) tmp[k2][j++]=tmp[k1][i2++]; else tmp[k2][j++]=tmp[k1][i1++]; } j = arrayMove(tmp, k1,k2,j,i2,N2);//i2側を複写して次へ } k1 = k2; k2 = 1 - k2;//入出力の逆転 } for(i=0;i