第12講 様々な並び替えの方法
第3話 並び替えその1の解説

大きい順にするには次のピンクの場所を
             for(j=i;j<N;j++){
               ikn=Mn(a,i);
             }
             w=a[i];
             a[i]=a[ikn];
             a[ikn]=w;
           }
              ・
              ・
              ・
        char Mn(int* p,int n){
           int i,ik;
           int Min=100;
           for(i=n;i<N;i++){
             if(p[i]<Min){
               Min=p[i];
               ik=i;
             }
           } 
           if(n==0)textBox7->Text=Min.ToString();
           return(ik);
        }
次のように変更します。
           for(i=0;i<4;i++){
             for(j=i;j<N;j++){
               ikn=Mn(a,i);
             }
             w=a[N-1-i];
             a[N-1-i]=a[ikn];
             a[ikn]=w;
           }
              ・
              ・
              ・
        char Mn(int* p,int n){
           int i,ik;
           int Min=100;
           for(i=0;i<N-n;i++){
             if(p[i]<Min){
               Min=p[i];
               ik=i;
             }
           } 
           if(n==0)textBox7->Text=Min.ToString();
           return(ik);
        }           for(i=0;i<4;i++){


ではプログラムを解説しましょう。大きい順に並び替える場合で説明します。
データがa[0]=91,a[1]=95,a[2]=42,a[3]=27,a[4]=36であるとします。
           for(i=0;i<4;i++){
             for(j=i;j<N;j++){
               ikn=Mn(a,i);
             }
            w=a[N-1-i];
             a[N-1-i]=a[ikn];
             a[ikn]=w;
           }
の第1回目のループでは、最小値は27なので、27と36を交換します。
その結果データは、a[0]=91,a[1]=95,a[2]=42,a[3]=36,a[4]=27となります。
2回目のループでは、i=1でikn=Mn(a,1);なので、char Mn(int* p,int n)のnはn=1です。
したがって、for(i=0;i<N-n;i++)はfor(i=0;i<N-1;i++)すなわちfor(i=0;i<4;i++)となっていますので、
探索対象はa[0]=91,a[1]=95,a[2]=42,a[3]=36に絞られています。そして、この中の最小値が36なので、
             w=a[N-1-i];
             a[N-1-i]=a[ikn];
             a[ikn]=w;
は今回意味がありませんので、データはa[0]=91,a[1]=95,a[2]=42,a[3]=36のままです。
次に,3回目のループになりi=2よりfor(i=0;i<3;i++)となり、探索対象はa[0]=91,a[1]=95,a[2]=42です。
最小値は42で今回も
             w=a[N-1-i];
             a[N-1-i]=a[ikn];
             a[ikn]=w;
には意味がなく、データはa[0]=91,a[1]=95,a[2]=42のままです。
4回目のループでは、for(i=0;i<2;i++)で探索対象は、a[0]=91,a[1]=95となります。
最小値は91なので、91と95の交換が行われ、a[0]=95,a[1]=91となります。
結局データは次のように書き換わりました。
a[0]=95,a[1]=91,a[2]=42,a[3]=36,a[4]=27
となり、大きい順になりました。

次にデータがa[0]=41,a[1]=67,a[2]=34,a[3]=0,a[4]=69の場合でトレースしてみましょう。
1回目のループでは、for(i=0;i<5;i++)より探索対象はすべてです。すると、最小値が0なので、0と69が交換されます。
a[0]=41,a[1]=67,a[2]=34,a[3]=69,a[4]=0
2回目のループでは、for(i=0;i<4;i++)より探索対象はa[0]=41,a[1]=67,a[2]=34,a[3]=69です。最小値が34で、34と69の交換が行われ、
データはa[0]=41,a[1]=67,a[2]=69,a[3]=34
3回目のループでは、for(i=0;i<3;i++)より探索対象はa[0]=41,a[1]=67,a[2]=69です。この中の最小値は41で41と69の交換が行われ、
データはa[0]=69,a[1]=67,a[2]=41となります。
4回目のループでは、for(i=0;i<2;i++)より探索対象はa[0]=69,a[1]=67です。この中の最小値は67で
              w=a[N-1-i];
              a[N-1-i]=a[ikn];
              a[ikn]=w;
は意味がなく、データはこのままでa[0]=69,a[1]=67です。
以上より、データは
a[0]=69,a[1]=67,a[2]=41,a[3]=34,a[4]=0に書き換わり、大きい順に並びました。

では、皆さんいろいろなデータでトレースして必ず大きい順に書き換わることを確認してみましょう。

ところで、今回は最小値をどんどん対象から外す方法で並び替えましたが、もちろん最大値を対象から外していく方法も考えられます。
また、せっかく最大値と最小値を求めるプログラムを考えたのですから、両方を同時に対象から除外していく方法は考えられないでしょうか。



第11講第6話へ 第12講第2話へ 第12講第4話へ 第13講第1話へ



vc++講義第1部へ
vb講義へ
VB講義基礎へ
初心者のための世界で一番わかりやすいVisual Basic入門基礎講座へ
初心者のための世界で一番わかりやすいVisual C++入門基礎講座へ