C言語関係掲示板

過去ログ

No.192.バブルソート


No.1211

sort
投稿者---inct(2002/03/07 14:30:13)


はじめまして。
ファイルに保存された成績を読み取り成績のよい順に名簿番号と成績を表示するプログラムというものがあるのですが、そのプログラムのsortという部分がよくわかりません。並べ替えの部分なのですが、どのように並べ替えているのか、並べ替えのループはどのように終わっているのかよくわかりません。どなたか教えていただけないでしょうか?


#include <stdio.h>

struct data{int bango;int tensu;}

main()
{
struct data h[100]; int i,j,hi,ba;
FILE *fp;
int n = 0,bango=1,tensu;

//読み込み//
fp = fopen("seiseki.txt","r");

if(fp == NULL){
printf("開けません");
}
while(fscanf(fp,"%d",&tensu) !=EOF){
h[n].bango = bango;
h[n].tensu = tensu;
bango++;
n++;
}

//sort//
for(i = 0;i<n;i++){
for(j = n - 1; j> i; j--){
if(h[j-1].tensu < h[j].tensu){
hi = h[j-1].tensu;
ba = h[j-1].bango;
h[j-1].tensu = h[j].tensu;
h[j-1].bango = h[j].bango;
h[j].tensu = hi;
h[j].bango = ba;

}
}
}

//表示//
for(i=0; i<n; i++){
printf("%d %d\n", h[i]);
}

fclose(fp);


}



No.1217

Re:sort
投稿者---B.Smith(2002/03/07 19:33:56)


こんばんは。

このソートのアルゴリズムはバブルソートです。
今回の処理では、データ列の末尾から順次隣同士を比較し、大きい値をデータ列の先頭側に移動する、ということを繰り返します。この操作を要素数−1回繰り返せば、全体をソートすることができます。

以下のプログラムは、配列Dataの内容を降順に並び替えるものです。No.1211のソート部分に似せて作ってあります。処理過程を表示するようになっていますので、もしLSI-C試食版を持っておられるならば、試してみてください。データがどのように並び替えられるのかが視覚的に分かると思います。
#include <stdio.h>
#include <conio.h>

void    Disp(int *,int ,int );

void main(void )
{
    int     Swap;
    int     Idx,Idx2;
    int     Data[] = {10,20,30,40,50,60,70,80,90,100};
    int     Num = sizeof(Data ) / sizeof(int );

    /* 要素数-1回繰り返す */
    for(Idx = 0;Idx < Num - 1;Idx++){

        /* データ列の末尾から先頭に向けて移動する */
        for(Idx2 = Num - 1; Idx2 > Idx;Idx2--){ 

            /* 処理過程の表示 */
            /* 何かキーを押すと次の処理を行います */
            Disp(Data,Num,Idx2);

            /* 現在の数値が、一つ前の数値よりも大きい場合 */
            if (Data[Idx2 - 1] < Data[Idx2]){

                /* データの入れ替え */
                /* 大きい値がデータの先頭側に移動することになる */
                Swap            = Data[Idx2 - 1];
                Data[Idx2 - 1]  = Data[Idx2];
                Data[Idx2]      = Swap;
            }
        }
    }

    /* 処理結果の表示 */
    /* 何かキーを押すと終了します */
    Disp(Data,Num,-1);
}

/* 表示関数 */
/* 正しく表示出来ていれば、詳しく理解する必要はありません */
void    Disp(int *Data,int Num,int Current)
{
    int     Idx;

    /* データ全部を表示 */
    for(Idx = 0;Idx < Num;Idx++){
        if (Idx == Current)
            printf("\033[44;33;1m");
        else
            printf("\033[0m");
        printf("%d\033[0m ",*(Data++));
    }

    printf("\n\n");
    getch();
}




No.1220

Re:sort
投稿者---inct(2002/03/08 09:35:21)


ありがとうございます。
試してみます。

戻る


「初心者のためのポイント学習C言語」 Last modified:2002.05.14
Copyright(c) 2000-2002 TOMOJI All Rights Reserved