直線上に配置
ポインタを用いてソートする

配列構造,構造体などを丸ごとソートする
例として,以下のような構造体をソートする.
#define XN 12 //パラメータの数

struct individual{
double x[XN];//パラメータ
double f1;    //目的関数
int rank;      //Pareto-rank
};

その1 直接選択法 大>小へのソート
#define IS 10 //データ数
void main(void)
{
 individual p[IS];
 individual *cp[IS],*ct,damy[IS];
int max,i,j,s;

 for(i=0;i<IS;i++)
   cp[i]=&p[i];     //ソートの準備

 for(i=0;i<IS-1;i++){
    max=cp[i]->rank;
    s=i;
    for(j=i+1;j<IS;j++){
       if(cp[j]->rank > max){  //小>大へソートする場合
          max=cp[j]->rank;       //cp[j]->rank < max とすればよい
          s=j;
        }
    }
    ct=cp[i];   cp[i]=cp[s];   cp[s]=ct; //ポインタの交換
 }
 //元に戻す
 for(i=0;i<IS;i++)
    damy[i]=*cp[i];
 for(i=0;i<IS;i++)
    p[i]=damy[i];
}
その2 シェルソート
#define IS 10 //データ数
void main(void)
{
 individual p[IS];
 individual *cp[IS],*ct,damy[IS];
int i,j,gap;

 for(i=0;i<IS;i++)
   cp[i]=&p[i];     //ソートの準備

//ギャップの初期値
 for(gap=1;gap<IS/3;gap=3*gap+1)
      ;

 while(gap>0){
    for(i=gap;i<IS;i=i++){
       for(j=i-gap;j>=0;j=j-gap){
          if(cp[j]->rank < cp[j+gap]->rank){
             ct=cp[j];cp[j]=cp[j+gap];cp[j+gap]=ct;
          }
          else
             break;
       }
    }
    gap=gap/3;
 }
 for(i=0;i<IS;i++)
    damy[i]=*cp[i];
 for(i=0;i<IS;i++)
    p[i]=damy[i];
}


トップ アイコントップページへもどる
直線上に配置