掲示板利用宣言

 次のフォームをすべてチェックしてからご利用ください。

 私は

 題名と投稿者名は具体的に書きます。
 課題の丸投げはしません。
 ソースの添付は「HTML変換ツール」で字下げします。
 返信の引用は最小限にします。
 環境(OSとコンパイラ)や症状は具体的に詳しく書きます。
 返信の付いた投稿は削除しません。
 マルチポスト(多重投稿)はしません。

掲示板2

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧

No.25658

単語の出現頻度
投稿者---スケイス(2006/01/23 03:49:37)


単語の優先順位が高い上位50個表示させたいのですが、どうもソートがうまくいきません。一応コンパイルはできるのですが、Segmentation fault (core dumped)このようなメッセージがでます。お分かりになる方アドバイスのほうよろしくお願いします。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#define TABLE_SIZE 5000        /*word_tableの大きさ*/
#define YUSEN_JYUNI 50

    struct word_count {
    char *word;  /*単語*/
    int count;   /*頻度*/
    };


int main(int argc, char *argv[])
{
    FILE *fp;
    struct word_count word_table[TABLE_SIZE]; /*単語と頻度を格納する配列*/
    char line[256], *token;
    int i,j,table_size,find,c,a[256],b;
    table_size = 0;

    /*ファイル入力にエラーが生じた場合*/
    if ((fp = fopen(argv[1], "r")) == NULL)
    {
        printf("file open error!!\n");
        exit(1);
    }

    while(fgets(line, 256, fp) != 0)
    {
        token = strtok(line, " \n");
        for(;token!= NULL;token = strtok(NULL, " \n"))
        {
            find = 0;
            /*word_tableとの照合*/
            for(i = 0; i < table_size; i++)
            {
                    
                /*一致する単語を見つけた場合*/
                if (strcmp(token, word_table[i].word) == 0)
                {
                    word_table[i].count++;
                    find = 1;
                    break;
                }
            }
                /*word_table中に一致する単語がなかった場合*/
                if (find == 0)
                {
                    word_table[table_size].word = malloc((strlen(token)+1)*sizeof(char));
                    strcpy(word_table[table_size].word,token);
                    word_table[table_size].count = 1;
                    table_size++;
                }
        }
    }
    fclose(fp);

    for(i=0;i<52;i++)
    {
        for(j=52;j>=i;j--)
        if(word_table[i].count>word_table[j].count)
        {
//      a=word_table[i].word;
//      word_table[i].word=word_table[j].word;
//      word_table[j].word=a;

            b=word_table[i].count;
            word_table[i].count=word_table[j].count;
            word_table[j].count=b;
        }
    }
    
    /*word_tableを出力*/
    for (i = 0; i < YUSEN_JYUNI ; i++)
    {
        printf("%4d: %s\n", word_table[i].count, word_table[i].word);
    }

    return(0);
}





この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:単語の出現頻度 25659 επιστημη 2006/01/23 04:35:20
<子記事> Re:単語の出現頻度 25675 RAPT 2006/01/23 22:24:28


No.25659

Re:単語の出現頻度
投稿者---επιστημη(2006/01/23 04:35:20)


> 一応コンパイルはできるのですが、Segmentation fault (core dumped)このようなメッセージがでます。

malloc/freeを使っていない時点で終わってるように思われます。



この投稿にコメントする

削除パスワード

No.25660

Re:単語の出現頻度
投稿者---επιστημη(2006/01/23 04:38:28)


>> 一応コンパイルはできるのですが、Segmentation fault (core dumped)このようなメッセージがでます。
>
>malloc/freeを使っていない時点で終わってるように思われます。

ごめん、使ってはいるのか。
そのエラーがどこで発生しているかぐらいはご自分で調べてください。



この投稿にコメントする

削除パスワード

No.25661

Re:単語の出現頻度
投稿者---スケイス(2006/01/23 04:52:47)


いつも回答ありがとうございます。
エラーがでていたのはテーブルが少なかったためだと思います。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#define TABLE_SIZE 7000        /*word_tableの大きさ*/
#define YUSEN_JYUNI 50

    struct word_count {
    char *word;  /*単語*/
    int count;   /*頻度*/
    };

int main(int argc, char *argv[])
{
    FILE *fp;
    struct word_count word_table[TABLE_SIZE]; /*単語と頻度を格納する配列*/
    char line[256], *token;
    int i,j,table_size,find,c,a[256],b;
    table_size = 0;

    /*ファイル入力にエラーが生じた場合*/
    if ((fp = fopen(argv[1], "r")) == NULL)
    {
        printf("file open error!!\n");
        exit(1);
    }

    while(fgets(line, 256, fp) != 0)
    {
        token = strtok(line, " \n");
        for(;token!= NULL;token = strtok(NULL, " \n"))
        {
            find = 0;
            /*word_tableとの照合*/
            for(i = 0; i < table_size; i++)
            {
                    
                /*一致する単語を見つけた場合*/
                if (strcmp(token, word_table[i].word) == 0)
                {
                    word_table[i].count++;
                    find = 1;
                    break;
                }
            }
                /*word_table中に一致する単語がなかった場合*/
                if (find == 0)
                {
                    word_table[table_size].word = malloc((strlen(token)+1)*sizeof(char));
                    strcpy(word_table[table_size].word,token);
                    word_table[table_size].count = 1;
                    table_size++;
                }
        }
    }
    fclose(fp);

    for(i=0;i<52;i++)
    {
        for(j=52;j>=i;j--)
        {
            if(word_table[i].count<word_table[j].count)
            {
//        strcpy(a,"word_table[i].word");
//        word_table[i].word=word_table[j].word;
//        word_table[j].word=a;

                b=word_table[i].count;
                word_table[i].count=word_table[j].count;
                word_table[j].count=b;
            }
        }
    }

    /*word_tableを出力*/
    for (i = 0; i < YUSEN_JYUNI ; i++)
    {
        printf("%4d: %s\n", word_table[i].count, word_table[i].word);
    }

    return(0);
}



カウントのソートはできましたが、文字のソートがうまくいきません。どのようにstrcpyを使えばよろしいのでしょうか??


この投稿にコメントする

削除パスワード

No.25662

Re:単語の出現頻度
投稿者---επιστημη(2006/01/23 05:09:50)


>カウントのソートはできましたが、文字のソートがうまくいきません。どのようにstrcpyを使えばよろしいのでしょうか??

文字列の比較をどうやってますか?
何度も言ってるけど、「うまくいかない」だけじゃ小学生以下。



この投稿にコメントする

削除パスワード

No.25663

Re:単語の出現頻度
投稿者---スケイス(2006/01/23 05:24:28)


たびたびすいません^^;
文字列の比較はstrcmpを使って行っています。

分からないところは、文字列の頻度が多い順に出力するための方法です。

文字列の比較がヒントなのでしょうか??


この投稿にコメントする

削除パスワード

No.25664

Re:単語の出現頻度
投稿者---επιστημη(2006/01/23 05:44:05)


>分からないところは、文字列の頻度が多い順に出力するための方法です。

やれやれ…「うまくいかない」のは文字列の"ソート"じゃなくて"交換"でしょうが。

文字列をポインタで持っているのだから、ポインタ同士を交換すればいい。



この投稿にコメントする

削除パスワード

No.25665

Re:単語の出現頻度
投稿者---si(2006/01/23 09:52:22)


 word_table[table_size].word = malloc((strlen(token)+1)*sizeof(char));
    strcpy(word_table[table_size].word,token);
    word_table[table_size].count = 1;
ここは?


この投稿にコメントする

削除パスワード

No.25690

Re:単語の出現頻度
投稿者---スケイス(2006/01/25 01:45:17)


επιστημηさんいつもいつもすいません^^;
言われたとおりにしましたらすんありできました。勉強不足です。

以下の通りにしました。

                strcpy(a,word_table[i].word);
                strcpy(word_table[i].word,word_table[j].word);
                strcpy(word_table[j].word,a);





この投稿にコメントする

削除パスワード

No.25691

Re:単語の出現頻度
投稿者---επιστημη(2006/01/25 01:53:46)


>以下の通りにしました。
>
                strcpy(a,word_table[i].word);
                strcpy(word_table[i].word,word_table[j].word);
                strcpy(word_table[j].word,a);


危なくないかしら?
一方の文字列が他方より短いとき、文字列領域を溢れさせません?




この投稿にコメントする

削除パスワード

No.25693

Re:単語の出現頻度
投稿者---スケイス(2006/01/25 01:55:21)


あ、言われてみたら。。。。また少しお時間ください^^;




この投稿にコメントする

削除パスワード

No.25695

Re:単語の出現頻度
投稿者---επιστημη(2006/01/25 02:51:59)


>あ、言われてみたら。。。。また少しお時間ください^^;

だからぁ、中身じゃなくて"ポインタ"を交換すればいいんとちゃいます?




この投稿にコメントする

削除パスワード

No.25717

Re:単語の出現頻度
投稿者---スケイス(2006/01/25 23:41:18)


επιστημηさん、中身を交換するのとポインタを交換するのとでは全然意味が違うんですね。アドバイスありふぁとうございました。


一応こんな感じにしてみました。
                moji = word_table[i].word;
                word_table[i].word = word_table[j].word;
                word_table[j].word = moji;


どうでしょうか?^^;


この投稿にコメントする

削除パスワード

No.25727

Re:単語の出現頻度
投稿者---επιστημη(2006/01/26 05:31:39)


> ...
> どうでしょうか?^^;

どうでしょうかって…テストしてOKならOKです。



この投稿にコメントする

削除パスワード

No.25675

Re:単語の出現頻度
投稿者---RAPT(2006/01/23 22:24:28)


// 私ならこう書くシリーズ、コメントなしバージョン
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

enum{ TABLE_SIZE = 7000 };
static const int YUSEN_JYUNI = 50;

typedef struct WORD_COUNT {
    char *word;
    int count;
} WORD_COUNT;

int cmp(const void *a, const void *b)
{
    return ((const WORD_COUNT*)b)->count - ((const WORD_COUNT*)a)->count;
}

int main(int argc, char *argv[])
{
    static const char * const seps = " \n";
    WORD_COUNT word_table[TABLE_SIZE] = {0};
    FILE *fp = NULL;
    char line[256] = {0}, *token = NULL;
    int i = 0, table_size = 0;

    if( argc < 2 || (fp = fopen(argv[1], "r")) == NULL ){
        fprintf(stderr, "file open error!!\n");
        return 1;
    }

    while( fgets(line, sizeof(line), fp) ){
        for( token = strtok(line, seps) ; token ; token = strtok(NULL, seps) ){
            for( i = 0; i < table_size; i++ ){
                if( strcmp(token, word_table[i].word) == 0 ){
                    word_table[i].count++;
                    break;
                }
            }
            if( i == table_size ){
                word_table[i].word = strdup(token);    // VC++依存
                word_table[i].count = 1;
                table_size++;
            }
        }
    }
    fclose(fp);

    if( table_size == 0 ){
        return 1;
    }
    qsort(&word_table, table_size, sizeof(word_table[0]), cmp);
    for( i = 0 ; i < YUSEN_JYUNI && i < table_size ; i++ ){
        printf("%4d: %s\n", word_table[i].count, word_table[i].word);
    }
    while( --table_size >= 0 ){
        free(word_table[table_size].word);
    }
    
    return 0;
}



この投稿にコメントする

削除パスワード

No.25692

Re:単語の出現頻度
投稿者---スケイス(2006/01/25 01:54:20)


part様、回答ありがとうございます。part様のをコンパイルして実行しましたが、画面に出力されませんでした。^^;

テキストの場所のURLを書きますのでそのファイルでもう一度やってもらえないでしょうか?

自分のソースです。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#define TABLE_SIZE 7000  //word_tableの大きさ
#define YUSEN_JYUNI 50

    struct word_count {
    char *word;  //単語
    int count;   //頻度
    };


int main(int argc, char *argv[])
{
    FILE *fp;
    struct word_count word_table[TABLE_SIZE]; //単語と頻度を格納する配列
    char line[256], *token,a[256];
    int i,j,table_size,find,b;
    table_size = 0;

    //ファイル入力にエラーが生じた場合
    if ((fp = fopen(argv[1], "r")) == NULL)
    {
        printf("file open error!!\n");
        exit(1);
    }

    while(fgets(line, 256, fp) != 0)
    {
        token = strtok(line, " \n");
        for(;token!= NULL;token = strtok(NULL, " \n"))
        {
            find = 0;
            //word_tableとの照合
            for(i = 0; i < table_size; i++)
            {
                    
                //一致する単語を見つけた場合
                if (strcmp(token, word_table[i].word) == 0)
                {
                    word_table[i].count++;
                    find = 1;
                    break;
                }
            }
                //word_table中に一致する単語がなかった場合
                if (find == 0)
                {
                    word_table[table_size].word = malloc((strlen(token)+1)*sizeof(char));
                    strcpy(word_table[table_size].word,token);
                    word_table[table_size].count = 1;
                    table_size++;
                }
        }
    }
    fclose(fp);

    //バブルソートで出現頻度順にソート
    for(i=0;i<52;i++)
    {
        for(j=52;j>=i;j--)
        {
            if(word_table[i].count<word_table[j].count)
            {
                strcpy(a,word_table[i].word);
                strcpy(word_table[i].word,word_table[j].word);
                strcpy(word_table[j].word,a);

                b=word_table[i].count;
                word_table[i].count=word_table[j].count;
                word_table[j].count=b;
            }
        }
    }
    
    //word_tableを出力
    for (i = 0; i < YUSEN_JYUNI ; i++)
    {
        printf("%4d: %s\n", word_table[i].count, word_table[i].word);
    }

    return(0);
}




コンパイルも実行もできるんですが、画面に出力される単語の数がテキストの中に存在する単語数より少なくなります。プログラムで唯一間違っていそうなところは、
for( i = 0 ; i < YUSEN_JYUNI && i < table_size ; i++ ){
ここかもしれないのですが、このように記述してもコンパイルエラーが起きるだけです。part様みたくいかないのが分かりません。ここのほかに間違ってるところがありましたら指摘などお願いします。


この投稿にコメントする

削除パスワード

No.25697

Re:単語の出現頻度
投稿者---iijima(2006/01/25 10:17:01)


> そのファイルでもう一度やってもらえないでしょうか?

「そのファイル」ではありませんが、ちゃんと実行できましたよ。
# ウェブ上のファイルは危なっかしくてダウンロードする気になりません。
# それから、人の名前は間違えないように気をつけましょう。
# 失礼でもあるし、なによりも注意力が足りないと思われのは損です。

で、本題。

>    //バブルソートで出現頻度順にソート
>    for(i=0;i<52;i++)
>    {
>        for(j=52;j>=i;j--)
>        {

"52"は何ですか?
多分、ここが問題です。

> 画面に出力される単語の数がテキストの中に存在する単語数より少なくなります。

テキスト中に存在する単語数は何個で、画面に出力される単語数は何個?
テキストの単語数を少ない場合はどうなる、多い場合はどうなる?
など、試行の経過を具体的に説明してください。

> for( i = 0 ; i < YUSEN_JYUNI && i < table_size ; i++ ){
> ここかもしれないのですが、このように記述してもコンパイルエラーが起きる

主問題の原因ではありませんが、これでもコンパイルエラーにはなりません。



この投稿にコメントする

削除パスワード

No.25718

Re:単語の出現頻度
投稿者---スケイス(2006/01/25 23:42:55)


iijimaさんアドバイスありがとうございます。すごいところまちがえてました。反省します。

以下のようにしました。

    for(i = 0; i < table_size; i++)
    {
        for(j = table_size; j >= i; j--)
        {



この投稿にコメントする

削除パスワード

No.25699

Re:単語の出現頻度
投稿者---iijima(2006/01/25 10:59:34)


> ここのほかに間違ってるところがありましたら

致命的なところだけ。

>        strcpy(a,word_table[i].word);
>        strcpy(word_table[i].word,word_table[j].word);
>        strcpy(word_table[j].word,a);

επιστημηさんも指摘済みですが、直っていません。



この投稿にコメントする

削除パスワード

No.25719

Re:単語の出現頻度
投稿者---スケイス(2006/01/25 23:45:06)


iijimaさん、RAPTさんに返信した時間とεπιστημηさんに返信した時間を見ていただければわかると思うのですが。。。

はじめにRAPTさんに返信した後でεπιστημηさんに返信したので、このようなかたちになってしまったのです。お許しください。


この投稿にコメントする

削除パスワード

No.25702

Re:単語の出現頻度
投稿者---まきじ(2006/01/25 11:36:19)


>テキストの場所のURLを書きますのでそのファイルでもう一度やってもらえないでしょうか?
>コンパイルも実行もできるんですが、画面に出力される単語の数がテキストの中に存在する単語数より少なくなります。

RAPT さんのコードで出力されている様ですが?
s.txt が長すぎて TABLE_SIZE の 7000 を超えてしまってるとかでしょう。
手動で数えられるぐらいの単語数でテストするのが良いと思います。


この投稿にコメントする

削除パスワード

No.25720

Re:単語の出現頻度
投稿者---スケイス(2006/01/25 23:46:36)


table_sizeの7000を超えていないのに実行結果が違ったために困っていました。どうやらテキストエディタの置き換え数が間違っていたようです。
お騒がせしました。


この投稿にコメントする

削除パスワード

No.25704

Re:単語の出現頻度
投稿者---RAPT(2006/01/25 12:03:51)


> i < YUSEN_JYUNI && i < table_size 
としたのは、table_size < YUSEN_JYUNI の場合、i が
table_size に達した時点で処理を終了するためです。

あなたは最初から色々全部やろうとしているのが致命的
だと思います。最初は少しずつ、確認しながら確実に
コードを作っていく方が良いです。

例えば、最初は
----------------------------------------
I have a pen.
It is a dog.
I have to go to a school.
----------------------------------------
のような、単純なテキストでテストすれば良いです。



この投稿にコメントする

削除パスワード

No.25721

Re:単語の出現頻度
投稿者---スケイス(2006/01/25 23:48:55)


i < YUSEN_JYUNI && i < table_size
このように使えるなんてしりませんでした^^;参考になります。エラーはSegmentation fault (core dumped)というものでしたが、どうやら入力するテキストのほうに問題があったみたいです。お騒がせしました。



この投稿にコメントする

削除パスワード

No.25715

Re:単語の出現頻度
投稿者---επιστημη(2006/01/25 21:00:44)


> 画面に出力されませんでした。^^;

また性懲りもなくその一言で済ます…
どこまでうまくいってて、どこからヘンになってるか、調べ方わかってます?

> for( i = 0 ; i < YUSEN_JYUNI && i < table_size ; i++ ){
> ここかもしれないのですが、このように記述してもコンパイルエラーが起きるだけです。

どんなコンパイルエラーですか?



この投稿にコメントする

削除パスワード

No.25722

Re:単語の出現頻度
投稿者---スケイス(2006/01/25 23:50:36)


テキストを変えることでコンパイルはできました。
実行しても画面に何も表示されませんでした。

コンパイルエラーはテキストに問題があったようです。お騒がせしました。


この投稿にコメントする

削除パスワード

No.25728

Re:単語の出現頻度
投稿者---επιστημη(2006/01/26 05:35:57)


>テキストを変えることでコンパイルはできました。
>実行しても画面に何も表示されませんでした。
>
>コンパイルエラーはテキストに問題があったようです。お騒がせしました。

ぅぅぅ、用語の使い方間違ってると思われ。
実行形式を生成するところまでがコンパイル(+リンク)。
実行は実行、コンパイルとは別です。
用語は正しく使わんと相手に通じませんぜ。



この投稿にコメントする

削除パスワード

No.25716

Re:単語の出現頻度
投稿者---RAPT(2006/01/25 23:30:00)


> strcpy(a,word_table[i].word);
> strcpy(word_table[i].word,word_table[j].word);
> strcpy(word_table[j].word,a);
επιστημηさんのヒントは無視ですか?

>> ポインタを交換
char *a;
a = word_table[i].word;
word_table[i].word = word_table[j].word;
word_table[j].word = a;
で充分だと思うのですが。

拙作で使用している qsort() も、実質は、このポインタ値を
交換しているだけですし。
# ところで、partさんって誰の事だろうね。。



この投稿にコメントする

削除パスワード

No.25723

Re:単語の出現頻度
投稿者---スケイス(2006/01/25 23:53:39)


RAPTさま、お名前を間違えてしまい申し訳ありませんでした。以後きおつけます。別に無視していたのではありません^^;なお、RAPTの方にさきに返信したため、そのように見えてしまったのだと思います。一生懸命ポインタのところを勉強していました。




この投稿にコメントする

削除パスワード

No.25724

Re:単語の出現頻度
投稿者---スケイス(2006/01/25 23:59:59)


皆様のアドバイスのおかげで自分なりに納得がいくプログラムを組むことができました。本当にありがとうございました。

最後に完成したソースをのせます。





この投稿にコメントする

削除パスワード

No.25726

Re:単語の出現頻度
投稿者---RAPT(2006/01/26 02:34:53)


ではダメ押しを。

> word_table[table_size]
で、有効な要素番号は、0〜(table_size-1)までの
table_size個ということはお分かり?

そうすると、
> for(j = table_size; j >= i; j--)
で本当にいいのか分かると思います。

ついでに、i == j のときの意味とか。(←こっちはさほど害がないけど)




この投稿にコメントする

削除パスワード

No.25730

Re:単語の出現頻度
投稿者---RAPT(2006/01/26 09:10:16)


【掲示板利用宣言】の
・返信の付いた投稿は削除しません。
に違反しています。


この投稿にコメントする

削除パスワード

No.25751

Re:単語の出現頻度
投稿者---スケイス(2006/01/26 21:38:28)


申し訳ありませんでした。^^;
コンパイルエラーが多発したため削除させていただきました。
問題を見つけている最中です。


この投稿にコメントする

削除パスワード

No.25732

Re:単語の出現頻度
投稿者---kz3(2006/01/26 10:00:19)



> for(j = table_size; j>= i; j--)
>で本当にいいのか分かると思います。
>ついでに、i == j のときの意味とか。(←こっちはさほど害がないけど)

それもあるけど、これって本当にバブルソートなのか、ちょっと疑問。
アルゴリズム的にはバブルソートは同じキーのデータはソート前とソート後とで
位置関係が保たれるという安定した整列アルゴリズムの部類に入ります。

ここではソートのキーとなるのは出現回数を降順でソートということなので
位置関係の維持は問題にはならないと思いますが、
今後複雑なデータ構造で間違ったバブルソートを使ってデータの位置関係が
失われている、
なんてことが無いように簡単なモデルで検証してみます。

仮に、内側のループを
for( j=table_size-1; j>=i; j-- )
と直したとして、

//バブルソートで出現頻度順にソート for( i=0; i<table_size; i++ ) { for( j=table_size-1; j>=i; j-- ) { if( num[i]<num[j] ) { b=num[i]; num[i]=num[j]; num[j]=b; } } }
とします。(numに出現回数が格納されているとします。) 同じ値のところは赤が先、青が後、という位置関係です。 5 4 10 5 10 6 6 4 10 5 10 5 10 4 10 5 6 5 10 4 10 5 6 5 10 4 10 5 6 5 10 4 10 5 6 5 10 4 10 5 6 5 10 5 10 5 6 4 10 6 10 5 5 4 10 6 10 5 5 4 10 10 6 5 5 4 10 10 6 5 5 4 10 10 6 5 5 4 降順でソートはされていますが位置関係が保たれていません。 本来ならば、 10 10 6 5 5 4 とソートされるのが正しいバブルソートです。 位置関係が壊れてしまった原因は離れた要素同士を比較対象にしているためなので、 これを前後の要素同士を比較して順序(ソートしようとする順序)が逆であれば 二つの要素の位置を交換するという動作を配列の後ろから前へ全ての要素に対して 行っていきます。(逆も可・・・でも泡?) 今のスケイスさんのバブルソートは泡が飛んだり跳ねたりしていますが、 泡は下から上へ徐々に上がってくるものです。 # と、こんな説明で正しかっただろうか。




この投稿にコメントする

削除パスワード

No.25733

Re:単語の出現頻度
投稿者---kz3(2006/01/26 10:18:14)



> for(j = table_size; j>= i; j--)
>で本当にいいのか分かると思います。
>ついでに、i == j のときの意味とか。(←こっちはさほど害がないけど)
>それもあるけど、これって本当にバブルソートなのか、ちょっと疑問。


どちらかというと選択ソートっぽいような。
でも選択ソートは一回のループで一回しか要素を交換しない、という点で
スケイスさんのアルゴリズムとは異なるけど。

# 選択ソートは不安定な整列アルゴリズムです。




この投稿にコメントする

削除パスワード

No.25779

Re:単語の出現頻度
投稿者---スケイス(2006/01/28 03:08:17)


kz3さんの親切な説明もありましたが、アルゴリズムの教科書と照らし合わせてどこが間違っているのかわからなかったのでバブルソートではなくオリジナルソートとして用いることにしました。先生などに質問して対処します。貴重なご意見ありがとうございました。


この投稿にコメントする

削除パスワード

No.25749

Re:単語の出現頻度
投稿者---スケイス(2006/01/26 21:33:33)


kz3さん返信ありがとうございます。
ソートの勉強をもう一度してみます。


この投稿にコメントする

削除パスワード

No.25750

Re:単語の出現頻度
投稿者---スケイス(2006/01/26 21:37:05)


RAPTさん返信ありがとうございます。
少ないデータで実行した結果、table_sizeのところが間違っていることが分かりました。
for(j = table_size-1; j >= i; j--)



この用に変更しました。アドバイスありがとうございました。


この投稿にコメントする

削除パスワード

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧