c言語 qsortについて

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
カヌー
記事: 45
登録日時: 11年前

c言語 qsortについて

#1

投稿記事 by カヌー » 10年前

都道府県の人口増加率を求めて、人口増加率の大きい順に並べ替えるプログラムを作成したいのですが 'double' から 'int' への変換とでて、qsortでうまく並べ替えができません。qsortでdouble型を比較して並べ替えるにはどのようにすればよいのでしょうか?

コード:

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

typedef struct KENMEI_DATA
{
	char kenmei[100];
	int zinkou1;
	int zinkou2;
	double zoukaritu;
} KENMEI;

int compare(const void *a, const void *b)
{
	KENMEI x=*(KENMEI*)a;
	KENMEI y=*(KENMEI*)b;

	double tmp1=x.zoukaritu;
	double tmp2=y.zoukaritu;

	return tmp2-tmp1;
}

int main(void)
{
	KENMEI data[5]= 
	{
		{"北海道", 5506, 5628, (double)(5506-5628)/5628*100},
		{"青森", 1373, 1437, (double)(1373-1437)/1437*100},
		{"岩手", 1330, 1385, (double)(1330-1385)/1385*100},
		{"宮城", 2348, 2360, (double)(2348-2360)/2360*100},
		{"秋田", 1086, 1146, (double)(1086-1146)/1146*100},
		
	};
	int i;

	qsort(data, 5, sizeof(KENMEI), compare);
	for(i=0; i<5; i++)
	{
		printf("%d, %s, %f%\n", i+1, data[i].kenmei, data[i].zoukaritu);
	}

	return 0;
}

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: c言語 qsortについて

#2

投稿記事 by みけCAT » 10年前

カヌー さんが書きました:qsortでdouble型を比較して並べ替えるにはどのようにすればよいのでしょうか?
素直にqsortでdouble型を比較して並べ替えるプログラムを書けば良いです。

compare関数以外は元のコードのままでいいはずです。

コード:

int compare(const void *a, const void *b)
{
	KENMEI x=*(KENMEI*)a;
	KENMEI y=*(KENMEI*)b;

	double tmp1=x.zoukaritu;
	double tmp2=y.zoukaritu;

	if(tmp2>tmp1)return 1;
	if(tmp2<tmp1)return -1;
	return 0;
}
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

カヌー
記事: 45
登録日時: 11年前

Re: c言語 qsortについて

#3

投稿記事 by カヌー » 10年前

試してみたところ無事できました。みけさんありがとうございます!

かずま

Re: c言語 qsortについて

#4

投稿記事 by かずま » 10年前

qsort は、配列の要素を何度も何度も交換してソートを実行します。

ところが、配列の要素のサイズ sizeof(KENMEI) は 120バイトです。
こんな大きなものを交換するのは感心しません。
次のように、ポインタの配列を用意して、それをソートすることを推奨します。

コード:

#include <stdio.h>
#include <stdlib.h>
 
typedef struct KENMEI_DATA {
    char kenmei[100];
    int zinkou1;
    int zinkou2;
    double zoukaritu;
} KENMEI;
 
int compare(const void *a, const void *b)
{
    KENMEI *x = *(KENMEI**)a, *y = *(KENMEI**)b;
    if (x->zoukaritu > y->zoukaritu) return -1;
    if (x->zoukaritu < y->zoukaritu) return 1;
    return 0;
}
 
int main(void)
{
    static KENMEI data[5] = {
        {"北海道", 5506, 5628, (double)(5506-5628)/5628*100},
        {"青森", 1373, 1437, (double)(1373-1437)/1437*100},
        {"岩手", 1330, 1385, (double)(1330-1385)/1385*100},
        {"宮城", 2348, 2360, (double)(2348-2360)/2360*100},
        {"秋田", 1086, 1146, (double)(1086-1146)/1146*100},
    };
    KENMEI *p[5];
    int i;
    for (i = 0; i < 5; i++) p[i] =  &data[i];
    qsort(p, 5, sizeof(KENMEI *), compare);
    for (i = 0; i < 5; i++)
        printf("%d, %s, %f%\n", i+1, p[i]->kenmei, p[i]->zoukaritu);
    return 0;
}

閉鎖

“C言語何でも質問掲示板” へ戻る