構造体配列を指定の順番でソートするには

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
勉強中

構造体配列を指定の順番でソートするには

#1

投稿記事 by 勉強中 » 10年前

質問です、構造体の配列のソートなのですが
配列を降順や昇順にするにはクイックソートを使えばよいと思うのですが

自分が指定した順番にソートしたい場合はどのように実装するのが良いのでしょうか
申し訳ありませんがご教授よろしくお願いいたします。

下記の例だと並べる品番をこちらで指定した下記のような順にソートするという感じです。
・5050、3010、3020、2020、5200の品番順にソートする

コード:

#include <stdio.h>
#include <stdlib.h>
#define NAMELEN 20

typedef struct {
    int hb;             //品番
    char name[NAMELEN]; //商品名
    int price;          //価格
} choco_t;

// --------------- 比較用の関数 cmp -------------------
int cmp( const void *p, const void *q ) {
    return ((choco_t*)p)->hb- ((choco_t*)q)->hb;
}

// ----------------------------------------------------
main()
{
    choco_t lst[] =
    { { 5200, "商品A", 1000 }, { 3010, "商品B", 840 }
    , { 2020, "商品C", 525 }, { 3020, "商品D", 720 }
    , { 5050, "商品E", 1200 } };
    int i;

    int n = sizeof lst / sizeof( choco_t );
    qsort( lst, n, sizeof(choco_t), cmp );

}
 

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

Re: 構造体配列を指定の順番でソートするには

#2

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

品番が被らない場合、

1. 品番とその品番を入れる場所(添字)の組の配列を作り、品番の昇順でソートする
2. ソート対象の構造体について、それぞれ1で作った配列から品番を二分探索し、新しい配列(ソート結果)のその添字の場所に格納する
3. 新しい配列のデータを元の配列にコピーする

とすれば、時間計算量O(N log N)、外部記憶の空間計算量O(N)でできると思います。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

勉強中

Re: 構造体配列を指定の順番でソートするには

#3

投稿記事 by 勉強中 » 10年前

早速のご返信ありがとうございます
なるほど、そんなやり方があるのですね。

2分探索ですか、勉強してみます。

ご回答ありがとうございました!

box
記事: 2002
登録日時: 15年前

Re: 構造体配列を指定の順番でソートするには

#4

投稿記事 by box » 10年前

勉強中 さんが書きました: 配列を降順や昇順にするにはクイックソートを使えばよいと思うのですが
必ずしもクイックソードだけではない、と申し上げておきます。
勉強中 さんが書きました: 下記の例だと並べる品番をこちらで指定した下記のような順にソートするという感じです。
・5050、3010、3020、2020、5200の品番順にソートする
そもそも、今回やりたいことをソートと呼べるのかどうか、いささか疑問があります。
それはさておき、元のデータが
勉強中 さんが書きました:

コード:

    { { 5200, "商品A", 1000 }, { 3010, "商品B", 840 }
    , { 2020, "商品C", 525 }, { 3020, "商品D", 720 }
    , { 5050, "商品E", 1200 } };
 
このように並んでいるのであれば、
要素[0]と要素[4]を交換する
要素[2]と要素[3]を交換する
という2つの手順ですみそうです。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

閉鎖

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