ページ 11

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

Posted: 2015年6月09日(火) 20:33
by 勉強中
質問です、構造体の配列のソートなのですが
配列を降順や昇順にするにはクイックソートを使えばよいと思うのですが

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

下記の例だと並べる品番をこちらで指定した下記のような順にソートするという感じです。
・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 );

}
 

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

Posted: 2015年6月09日(火) 20:46
by みけCAT
品番が被らない場合、

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

とすれば、時間計算量O(N log N)、外部記憶の空間計算量O(N)でできると思います。

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

Posted: 2015年6月09日(火) 21:27
by 勉強中
早速のご返信ありがとうございます
なるほど、そんなやり方があるのですね。

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

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

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

Posted: 2015年6月09日(火) 21:45
by box
勉強中 さんが書きました: 配列を降順や昇順にするにはクイックソートを使えばよいと思うのですが
必ずしもクイックソードだけではない、と申し上げておきます。
勉強中 さんが書きました: 下記の例だと並べる品番をこちらで指定した下記のような順にソートするという感じです。
・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つの手順ですみそうです。