LoginSignup
3
0

More than 5 years have passed since last update.

【C言語】分布数え上げソートの簡単な実装方法

Last updated at Posted at 2018-02-20

分布数え上げソートとは

ソートする配列の値範囲が既知の場合,分布数え上げソート (カウンティングソート)
が最速となる。
具体的な仕組みは以下参照
分布数え上げソート [Counting Sort]
C言語アルゴリズム-分布数え上げソート

単純な実装方法

・配列data[n]を昇順でソート
・配列data[]の値範囲は0~max
のとき

main.c
#define REP(i,n) for(int i=0;i<n;i++)

int main() {
    ...
    int tmp[max+1], arg = 0; //ソート用の配列と変数
    REP(i,max+1) tmp[i] = 0; //配列tmp[]を0で初期化
    REP(i,n) tmp[data[i]]++; //数え上げ
    REP(i,max+1) REP(j,tmp[i]) data[arg++] = i; //小さい順に格納
    ...
}

少し複雑に

・配列data[]のtop~end番目の要素だけを昇順でソート
・top~end番目の要素値の範囲はmin~max
のとき

main.c
#define FOR(i,a,b) for(int i=a;i<b;i++)

int main() {
    ...
    int arg = top, tmp[max-min+1]; //ソート用の配列と変数
    FOR(i,0,max-min+1) tmp[i] = 0; //配列tmp[]を0で初期化
    FOR(i,top,end+1) tmp[data[i] - min]++; //数え上げ
    FOR(i,0,max-min+1) FOR(j,0,tmp[i]) data[arg++] = i + min; //小さい順に格納
    ...
}
3
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
0