交換法のアルゴリズム
Posted: 2010年6月03日(木) 09:08
以下のプログラムは交換法を使って降順に並べるプログラムです。
具体的には、以下のようなアルゴリズムです。
① 添え字a[0]~a[4]から最大値をみつけて、a[0]と交換する。
② 添え字a[1]~a[4]から最大値をみつけて、a[1]と交換する。
③ 添え字a[2]~a[4]から最大値をみつけて、a[2]と交換する。
④ 添え字a[3]~a[4]から最大値をみつけて、a[3]と交換する。
⑤ a[4]が必然的にひとつに決まる。
このプログラムを応用して、次のような自分なりのアルゴリズムをプログラムとして実現したいのですが、どのようにプログラムにしたらよいか、紙や鉛筆を使ってトレースして何度も考えまくったのですが、なかなかいい方法がなさそうなのです。自分で考えたプログラムの途中を示します。
① 添え字a[0]~a[4]のなかの最大値を見つけたら、その要素を最後尾の要素(つまり、a[4])と交換する。(これでa[4]の値が確定する)
② 添え字a[0]~a[3]のなかの最小値を見つけたら、その要素を先頭の要素(つまり、a[0])と交換する。
(これで、a[0]の値が確定する。)
③ 添え字a[1]~a[3]のなかの最大値を見つけたら、その要素をa[3]と交換する。
(これで、a[3]の値が確定する。)
④ 添え字a[1]~a[2]のなかから最小値を見つけたら、その要素をa[1]と交換する。
(これで、a[1]が確定し、a[2]は必然的に決まる。)
どのように改良すればよいのでしょうか。
どなたかご教授願います。
具体的には、以下のようなアルゴリズムです。
① 添え字a[0]~a[4]から最大値をみつけて、a[0]と交換する。
② 添え字a[1]~a[4]から最大値をみつけて、a[1]と交換する。
③ 添え字a[2]~a[4]から最大値をみつけて、a[2]と交換する。
④ 添え字a[3]~a[4]から最大値をみつけて、a[3]と交換する。
⑤ a[4]が必然的にひとつに決まる。
#include <stdio.h>
int main (void)
{
int i,j,k,w;
int a[5]={2,5,3,1,4};
for(i=0;i<4;i++){
k=i;/*交換する場所*/
for(j=i+1;j<5;j++){
if(a<a[j]){
i=j;/*最大値の添え字の設定*/
}
}
w=a; a=a[k];a[k]=w; /*要素の交換*/
}
return 0;
}このプログラムを応用して、次のような自分なりのアルゴリズムをプログラムとして実現したいのですが、どのようにプログラムにしたらよいか、紙や鉛筆を使ってトレースして何度も考えまくったのですが、なかなかいい方法がなさそうなのです。自分で考えたプログラムの途中を示します。
① 添え字a[0]~a[4]のなかの最大値を見つけたら、その要素を最後尾の要素(つまり、a[4])と交換する。(これでa[4]の値が確定する)
② 添え字a[0]~a[3]のなかの最小値を見つけたら、その要素を先頭の要素(つまり、a[0])と交換する。
(これで、a[0]の値が確定する。)
③ 添え字a[1]~a[3]のなかの最大値を見つけたら、その要素をa[3]と交換する。
(これで、a[3]の値が確定する。)
④ 添え字a[1]~a[2]のなかから最小値を見つけたら、その要素をa[1]と交換する。
(これで、a[1]が確定し、a[2]は必然的に決まる。)
#include<stdio.h>
int main(void)
{
int i,j,k,l,saisho,saidai;
int a[5]={2,5,3,1,4};
saisho=0;
saidai=0;
for(i=4;i>0;i--){
k=i;
l=4-k;/*最大値と交換する要素の添え字*/
for(j=i-1;j>-1;j++){
if(a<a[j]){
i=j; saidai=a;
}
if(a>a[j]){
i=j; saisho=a
}
......
return 0;
}どのように改良すればよいのでしょうか。
どなたかご教授願います。