掲示板ランキング  焼酎セット  その他焼酎  レギュラー(キリマンジャロ)


掲示板利用宣言

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

 私は

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

掲示板1

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

No.7392

配列を使ったソートについて
投稿者---take(2007/04/28 20:02:42)


はじめまして、takeといいます。
今、配列を使ったソートを勉強しています。
環境はXpのVisual C++ 2005です。

#include <stdio.h>

int main(void)
{
    int i,j,n,num;
    int a[20]={2,5,87,69,15,41,11,10,53,4,
               23,78,1,45,6,8,3,25,21,9};

    for(i=0; i<20; i++){
        for(n=i+1; n<21; n++){
            if(a[i]>a[n]){
                num=a[n];
                a[n]=a[i];
                a[i]=num;
            }
        }
    }

    for(i=0; i<20; i++){
        printf("%d\n",a[i]);
    }
}

このように、1次元配列でのソートはうまくいきました。しかし、これに手を加えて多次元配列でのソートにしようと思った時に、多次元配列の初期化までは分かるのですが、ソートの肝になる部分(for構文)が複雑でよく分からず、上のソースのどこに手を加えていけばよいのかが分かりません。どのようにすればよいのでしょうか?


この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:配列を使ったソートについて 7393 bugs 2007/04/28 20:31:57
<子記事> Re:配列を使ったソートについて 7402 あかま 2007/04/30 20:01:50


No.7393

Re:配列を使ったソートについて
投稿者---bugs(2007/04/28 20:31:57)


「1次元配列のソートはうまくいった」とありますが、
コードに問題があります。
>        for(n=i+1; n<21; n++){
>            if(a[i]>a[n]){

nは20までの値をとりますが、配列の要素数は20なので、
a[20]は定義の範囲外です。


多次元配列のソートの件ですが、例えば2次元のとき、
どういう風にしたいのですか?
文章で説明していただけますか?


この投稿にコメントする

削除パスワード

No.7394

Re:配列を使ったソートについて
投稿者---take(2007/04/29 08:09:53)


アドバイスありがとうございます。説明不足ですみませんでした。私が今やりたいのは3、行5列の2次元配列の各要素に値を入れておいて、それを大きい順に並び替えるというものなんです。なにぶん初心者なので説明下手ですいません。


この投稿にコメントする

削除パスワード

No.7395

Re:配列を使ったソートについて
投稿者---bugs(2007/04/29 09:10:54)


qsort()という便利な標準関数があるので、それを使った例を挙げます。
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

#define ROW (3)
#define COL (5)

void setValue(int (*arr)[COL], int row);
void sortArray(int (*arr)[COL], int row);
int int_rcmp(const int *a, const int *b);
void printArray(int (*arr)[COL], int row);

int main(void)
{
    int array[ROW][COL];
    
    setValue(array, ROW);
    
    printf("【ソート前】\n");
    printArray(array, ROW);
    
    sortArray(array, ROW);
    
    printf("【ソート後】\n");
    printArray(array, ROW);
    return 0;
}

void setValue(int (*arr)[COL], int row)
{
    int i, j;
    
    srand((unsigned int) time(NULL));
    for (i = 0; i < row; i++)
        for (j = 0; j < COL; j++)
            arr[i][j] = rand();
}

void sortArray(int (*arr)[COL], int row)
{
    qsort(arr, row * COL, sizeof(int),
        (int (*) (const void *, const void *)) int_rcmp);
}

int int_rcmp(const int *a, const int *b)
{
    return (*a < *b) ? 1 : (*a > *b) ? -1 : 0;
}

void printArray(int (*arr)[COL], int row)
{
    int i, j;
    
    for (i = 0; i < row; i++) {
        for (j = 0; j < COL; j++)
            printf("[%d][%d]=%5d ", i, j, arr[i][j]);
        putchar('\n');
    }
    putchar('\n');
}




この投稿にコメントする

削除パスワード

No.7396

Re:配列を使ったソートについて
投稿者---επιστημη(2007/04/29 10:44:38)
http://blogs.wankuma.com/episteme/


> 3、行5列の2次元配列の各要素に値を入れておいて、それを大きい順に並び替えるというものなんです。

だからー、data[0][0]からdata[2,4]は大きい順にどう並ぶんでしょ?
「あたかも1次元であるかのように」でしょうか?
data[0][4]の次に大きいのはdata[1][0]ですか?
そこ説明せんとあかんでしょ。



この投稿にコメントする

削除パスワード

No.7402

Re:配列を使ったソートについて
投稿者---あかま(2007/04/30 20:01:50)


επιστημηさんも気にしてらっしゃいますが、
data[0][4]の次に大きいのがdata[1][0]であるならば、
多次元配列でもデータが繋がっているのが保証されているので
一次元配列としてソートしてやればよかったりします。


#include <stdio.h>

int main(void)
{
    int i,j,n,num;
    int a[4][5]={{2,5,87,69,15},{41,11,10,53,4},
               {23,78,1,45,6},{8,3,25,21,9}};
    
    int *b = &a[0][0];//aの先頭アドレスゲット
    
    for(i=0; i<20; i++){//bを一次元としてソート
        for(n=i+1; n<20; n++){
            if(b[i]>b[n]){
                num=b[n];
                b[n]=b[i];
                b[i]=num;
            }
        }
    }

    for(i=0; i<20; i++){
        printf("%d\n",a[i/5][i%5]);
    }
}





この投稿にコメントする

削除パスワード

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





掲示板提供:(有)リアル・インテグリティ