ポインタを用いてソートする
配列構造,構造体などを丸ごとソートする
例として,以下のような構造体をソートする.
#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];
}
-
|