ソート法

 

概要

データ列をある規則にしたがって並べ替えることを、ソート(Sort)といいます。そして、1,2,5,7,・・・というように数の小さい順に並べることを昇順といい、逆に、・・・,7,5,2,1と数の大きい順に並べることを降順といいます。

 

--------------------------------------------

●ソートの分類

--------------------------------------------

ソート法には、次のような方法があります。

(1)直接選択法

(2)バブル・ソート

(3)クイック・ソートなど

この内、(1)と(2)の方法について、プログラム例を示します。

 

--------------------------------------------

●直接選択法(昇順の場合)

--------------------------------------------

数列から最大(最小)を探すことを繰り返す。

比較回数は多いが交換回数が少ない。

 

#include<stdio.h>

 

#define N 5

 

main()

{

        int x[N] = {3,4,1,5,2};

        int i,j,min,id,z;

 

        printf("[s] : ");

        for(i=0;i<N;i++)

                printf(" %d",x[i]);

        printf("\n");

 

        for(i=0;i<N-1;i++){

                min = x[i];

                id = i;

                printf("   id:%d, min:%d\n",id,min);

                for(j=i+1;j<N;j++){

                        if(min>x[j]){

                                min = x[j];

                                id = j;

                                printf("   id:%d, min:%d\n",id,min);

                        }

                }

                z = x[i];

                x[i] = min;

                x[id] = z;

                printf("   (%d) <-> (%d)\n",z,min);

 

                printf("[%d] : ",i);

                for(j=0;j<N;j++)

                        printf(" %d",x[j]);

                printf("\n");

        }

 

        printf("[e] : ");

        for(i=0;i<N;i++)

                printf(" %d",x[i]);

        printf("\n");

}

 

--------------------------------------------

バブル・ソート昇順の場合

--------------------------------------------

隣接する2項を逐次交換する。

原理は簡単だが、交換回数が多い。

 

#include<stdio.h>

 

#define N 5

 

main()

{

        int x[N] = {5,3,1,4,2};

        int i,j,z;

 

        printf("[s] : ");

        for(i=0;i<N;i++)

                printf(" %d",x[i]);

        printf("\n");

 

        for(i=0;i<N-1;i++){

                for(j=N-1;j>i;j--){

                        if(x[j]<x[j-1]){

                                printf("   (%d)(%d) -> ",x[j-1],x[j]);

                                z = x[j];

                                x[j] = x[j-1];

                                x[j-1] = z;

                                printf("(%d)(%d)\n",x[j-1],x[j]);

                        }

                }

                printf("[%d] : ",i);

                for(j=0;j<N;j++)

                        printf(" %d",x[j]);

                printf("\n");

        }

 

        printf("[e] : ");

        for(i=0;i<N;i++)

                printf(" %d",x[i]);

        printf("\n");

}