【掲示板ご利用上の注意】

 ※題名は具体的に!
 ※学校の課題の丸投げ禁止!
 ※ソースの添付は「HTML変換ツール」で字下げ!
 ※返信の引用は最小限に!
 ※環境(OSとコンパイラ)や症状は具体的に詳しく!
 ※マルチポスト(多重投稿)は慎んで!

 詳しくはこちら



 本当はこんなに大きく書きたくはないのですが、なかなか守っていただけなくて…。
 守ってくださいね。お願いします。(by管理人)

C言語ソース⇒HTML形式ツール   掲示板2こちら


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

No.20282

2つの条件下でのソート
投稿者---macman(2005/03/09 03:44:16)


以下のような2つの条件を満たすソートをしたいのです。
ソート前
年齢 身長 体重
18 170 64
19 165 62
19 182 76
18 176 87
18 167 70
ソート後
18 167 70
18 170 64
18 176 87
19 165 62
19 182 76
と言う具合に、第一条件が年齢で昇順、第2条件が身長で昇順の2つの
条件でソートするにはどのようにしたらよろしいでしょうか。
一つの条件では出来るのですが、2つになるとどうしたらよいか・・・。
どうか教えてください。


この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:2つの条件下でのソート 20283 chu- 2005/03/09 06:54:09
<子記事> Re:2つの条件下でのソート 20284 通りすがり 2005/03/09 09:19:36


No.20283

Re:2つの条件下でのソート
投稿者---chu-(2005/03/09 06:54:09)


自作のソート関数ならば、たとえばこんな感じの関数で判定して交換を行えばできるのではないでしょうか。
標準関数のqsortを利用したい場合は変更が必要です。

int gt(a, b)    /* a>bなら真 */
{
    if ( (a.年齢 > b.年齢) || (a.年齢 == b.年齢 && a.身長 > b.身長) )
        return 1;
    return 0;
}



この投稿にコメントする

削除パスワード

No.20284

Re:2つの条件下でのソート
投稿者---通りすがり(2005/03/09 09:19:36)


>以下のような2つの条件を満たすソートをしたいのです。
>--省略--
>と言う具合に、第一条件が年齢で昇順、第2条件が身長で昇順の2つの
>条件でソートするにはどのようにしたらよろしいでしょうか。
>一つの条件では出来るのですが、2つになるとどうしたらよいか・・・。
>どうか教えてください。

年齢・身長共に昇順固定なら
(年齢 * 1000) + 身長
で比較するとか。。。



この投稿にコメントする

削除パスワード

No.20288

Re:2つの条件下でのソート
投稿者---macman(2005/03/09 13:47:08)


アドバイス有り難うございます。
いろいろやってはみたのですがうまくいかなくて・・・

今こんな感じです。

#include <stdio.h>
#include <stdlib.h>

void Hpsort(int a[ ], int b[ ], int c[ ], int n);
void DownHeap(int a[ ], int b[ ], int c[ ],  int top, int bottom);
void Swap(int a[ ], int b[ ], int c[ ],  int i, int j);

int main()
{
    int i,j;
    int a1,a2,a3;
    char tmp[1000];
    int temp1[1000];
    int temp2[1000];
    int temp3[1000];
    
    
    FILE *fp;
    
    i = 1;

    printf("Before:\n");
    if((fp = fopen("data0001c.txt","r"))!=NULL)
    {
    while(fgets(tmp,1024,fp)!=NULL)
    {
      sscanf(tmp, "%d %d %d", &a1,&a2,&a3);
        temp1[i]=a1;
        temp2[i]=a2;
        temp3[i]=a3;
        
        printf("%d %d %d\n", temp1[i],temp2[i],temp3[i]);   
        i++;
    }
    Hpsort(temp1,temp2,temp3,i-1);
    }
    
    printf("\nAfter:\n");
    for (j = 1; j < i; j++) 
      printf("%d %d %d\n", temp1[j],temp2[j],temp3[j]);
    printf("\n");

    return EXIT_SUCCESS;
}

void Hpsort(int a[ ], int b[ ], int c[ ], int n)
{
int leaf, root;

leaf = n;
root = n/2;

while (root > 0 ) {
DownHeap(a, b, c, leaf, root);
root--;
}


while(leaf > 0) {
Swap(a, b, c, 1, leaf);
leaf--;
DownHeap(a, b, c, leaf, 1);
}
}

void DownHeap(int a[ ], int b[ ], int c[ ], int leaf, int root)
{
int i;

i = root * 2;

while (i <= leaf) {

if (i < leaf && a[i + 1] > a[i])
i++;
if (a[root] >= a[i])
break;

Swap(a, b, c, root, i);

root = i;
i = root * 2;
}
}


void Swap(int a[ ], int b[ ], int c[ ], int i, int j)
{
int temp,temp2,temp3;


temp = a[i];
a[i] = a[j];
a[j] = temp;

temp2 = b[i];
b[i] = b[j];
b[j] = temp2;

temp3 = c[i];
c[i] = c[j];
c[j] = temp3;



}



どこをどうしたらよいのやら。


この投稿にコメントする

削除パスワード

No.20289

Re:2つの条件下でのソート
投稿者---nop(2005/03/09 14:03:35)


>どこをどうしたらよいのやら。

まず、構造体を覚えて下さい。


この投稿にコメントする

削除パスワード

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