ページ 11

ソートについてなのですが・・・

Posted: 2013年11月05日(火) 17:33
by karasumi431
こんにちわ、初めてこのサイトを利用します。
単純選択ソートについて課題が出されたのですが、今までバブルソートしかやってこなかったのでこんがらがっています・・・
乱数を発生させてその数を配列に入れて降順にソートするのですが、ソートの部分を関数void sort(int ab[],n)を利用して作らなければならなくて
とりあえず乱数を発生させて配列に入れて表示させるところまではできたのですが・・・
どなたか分かりやすくプログラムとその説明を教えてくださいませんでしょうか?
聞き方間違えていたら申し訳ないです、よろしくお願いします。

Re: ソートについてなのですが・・・

Posted: 2013年11月05日(火) 17:57
by usao
>ソートの部分を関数void sort(int ab[],n)を利用して作らなければならなくて

既にソート処理の関数が用意されているなら
あとは呼ぶだけなのでは…??

とりあえず課題であれば,可能ならば課題の内容全てが分かる形の方が(誰かが)答えやすいと思います.
さらに,「現在どこまできていて,どこができていない」みたいなのをコードで示すと良いかと.

#フォーラムルールにコードの部分をどう書けばいいかなどが書かれているので目を通してください

Re: ソートについてなのですが・・・

Posted: 2013年11月05日(火) 18:37
by box
usao さんが書きました:>ソートの部分を関数void sort(int ab[],n)を利用して作らなければならなくて

既にソート処理の関数が用意されているなら
あとは呼ぶだけなのでは…??
私の解釈はこうです。
void sort(int ab[], n)
というプロトタイプ宣言を持つ関数を「単純選択法を使って『自作』」し、
プログラム全体を完成させる。

この解釈が正しいかどうかは、質問者さんのみぞ知る。

Re: ソートについてなのですが・・・

Posted: 2013年11月05日(火) 21:06
by みけCAT
box さんが書きました:私の解釈はこうです。
void sort(int ab[], n)
というプロトタイプ宣言を持つ関数を「単純選択法を使って『自作』」し、
プログラム全体を完成させる。
私は

コード:

void sort(int ab[], n) {
    /* 処理を書く */
}
を実装しろ、という意味だと考えました。

しかし、プロトタイプ宣言ならば

コード:

typedef size_t n;
というコードをその前に書けば普通にコンパイルを通せるので、
プロトタイプ宣言と解釈したほうが適切だと思います。

Re: ソートについてなのですが・・・

Posted: 2013年11月05日(火) 21:50
by box
自作するでも実装するでもどっちでもいいんですが、
要するに、別の回答者さんが書かれている
「すでにできあがっている関数を呼ぶだけ」ではないであろう、
ということです。それじゃ課題にならない。

おそらく、その課題の本質は「単純選択ソートというアルゴリズムを
自分のものにする」ところにあると思います。
したがって、出来合いのコードを使うのではなく、自作する(自分で実装する)点に
大きな意味があると思います。
というわけですから、頑張ってください。>質問者さん

Re: ソートについてなのですが・・・

Posted: 2013年11月06日(水) 10:45
by non
ここが参考になると思われます。
http://www.geocities.jp/ky_webid/Progra ... t/002.html

Re: ソートについてなのですが・・・

Posted: 2013年11月06日(水) 23:30
by 鴉味
non さんが書きました:ここが参考になると思われます。
http://www.geocities.jp/ky_webid/Progra ... t/002.html
こちらを参考に書いたのですがソート後の出力がうまくいきません、何が間違えているのでしょうか?

コード:

 
#include"kansuu.h"

void main(void)
{
	int a[N];
	int i;

	printf("ソート前データ\n");
	srand((unsigned)time(NULL));
	for(i=0;i<N;i++)
	{
		a[i]=rand()%100+1;
		printf("%d",a[i]);
	}
	putchar('\n');

	printf("ソート後データ\n");
	sort(a,N);
	for(i=0;i<N;i++)
	{
		printf("%d",a[i]);
	}
	putchar('\n');

}


ソート 関数

コード:

 

#include"kansuu.h"

void sort(int ab[],int n)
{
	int i,j,k;
	int temp;
	int min;
	
	for(i=0;i<n-1;i++){
		min=ab[i];
		k=i;
		for(j=i+1;j<n;j++){
			if(min>ab[j]){
				min=ab[j];
				k=j;
			}
	temp = ab[i];
        	ab[i] =ab[k];
        	ab[k] = temp;
		}
	}
}
				

コード:

 

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define N 10

void sort(int ab[],int n);

Re: ソートについてなのですが・・・

Posted: 2013年11月06日(水) 23:32
by みけCAT

コード:

printf("%d",a[i]);
という行(2箇所)を、

コード:

printf("%d%s",a[i],i+1<N?" ":"");
としてみてください。

Re: ソートについてなのですが・・・

Posted: 2013年11月06日(水) 23:35
by みけCAT
sort関数の入れ替え部分は、jのループの外に出すほうがいいと思います。

コード:

void sort(int ab[],int n)
{
	int i,j,k;
	int temp;
	int min;

	for(i=0;i<n-1;i++){
		min=ab[i];
		k=i;
		for(j=i+1;j<n;j++){
			if(min>ab[j]){
				min=ab[j];
				k=j;
			}
		}
		temp = ab[i];
		ab[i] =ab[k];
		ab[k] = temp;
	}
}

Re: ソートについてなのですが・・・

Posted: 2013年11月06日(水) 23:42
by 鴉味
まだ外部シンボル '_sort' が未解決とエラーが出ます・・・何かが抜けているのでしょうか・・・?

Re: ソートについてなのですが・・・

Posted: 2013年11月06日(水) 23:46
by みけCAT
きちんと2個のソースファイルをコンパイルしたオブジェクトファイルをリンクしましたか?

わざわざオブジェクトファイルを作らなくても、最初のソースコードをmain.c、二番目のソースコードをsort.cだと仮定して、

コード:

>gcc -s -o sort main.c sort.c
としてコンパイルすればいいはずです。

Re: ソートについてなのですが・・・

Posted: 2013年11月06日(水) 23:56
by 鴉味
学校で使っているものと違うので、慣れてなかったので操作を間違えていました><
やってみたらしっかりと実行して昇順にソートしていました。ありがとうございます^^

Re: ソートについてなのですが・・・

Posted: 2013年11月07日(木) 00:09
by みけCAT
課題は降順にソートすることだったと思いますが、大丈夫ですか?

Re: ソートについてなのですが・・・

Posted: 2013年11月07日(木) 07:20
by 鴉味
すいません、ごっちゃになってました
if文の演算子を逆にしたら降順になったので大丈夫です。
ご指摘ありがとうございます><