質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

ソート

複数のデータを、順序性に従って並べ替えること。 データ処理を行う際に頻繁に用いられ、多くのアルゴリズムが存在します。速度、容量、複雑さなどに違いがあり、高速性に特化したものにクイックソートがあります。

Q&A

解決済

1回答

1052閲覧

int型の配列において正常にインクリメントされない原因がわかりません

apeirogon0813

総合スコア117

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

ソート

複数のデータを、順序性に従って並べ替えること。 データ処理を行う際に頻繁に用いられ、多くのアルゴリズムが存在します。速度、容量、複雑さなどに違いがあり、高速性に特化したものにクイックソートがあります。

0グッド

0クリップ

投稿2018/12/11 04:51

前提・実現したいこと

基数ソートのプログラムにおいてある配列を0で初期化した後、インクリメントするようにしてみたのですが、出力を行ってみると0のままでインクリメントされていなく、原因がわかりません。

発生している問題・エラーメッセージ

d[0] = 75 or 4b c[75] = 0 d[1] = 114 or 72 c[114] = 0 d[2] = 58 or 3a c[58] = 0 d[3] = 57 or 39 c[57] = 0 d[4] = 114 or 72 c[114] = 0 となり、インクリメントされていない

該当のソースコード

C

1#include<stdio.h> 2 3struct point{ int x, y;}; 4 5void radix_sort(struct point a[], int n, int r, int dmax) { 6 int i, j; 7long long int d[128]; //(1) 8 struct point b[128]; 9 for(j=0; j<dmax; j++) { 10 int c[500] = {0}; //////////このようにcの配列を初期化 11 for(i=0; i<n; i++) { //(2) && (4) 12 b[i] = a[i]; 13 d[i] = (a[i].x >> (j * r)) & ((1 << r) - 1); 14 printf("d[%d] = %d or %x\n",i,d[i],d[i]); 15/////////////////////////// 16 c[d[i]]++; /////////この式においてインクリメントされない。 17////////////////////////// 18 printf("c[%d] = %d\n",d[i],c[i]); 19 } 20 for(i=1; i<r*dmax; i++) { //(3) 21 c[i] = c[i] + c[i-1]; 22 printf("c[%d] = %d\n",i,c[i]); 23 } 24 for(i=n-1; i>=0; i--) { //(5) 25 c[d[i]]--; 26 a[c[d[i]]] = b[i]; 27 } 28 for(i=0;i<n;i++) { 29 printf("%d %d\n",a[i].x,a[i].y); 30 } 31 printf("--\n"); 32 } 33} 34 35 int main(void) { 36 char buf[128]; 37 struct point p, arr[128]; 38 int i = 0, n, r, dmax; 39 scanf("%d %d ",&r, &dmax); 40 41 while(fgets(buf,sizeof(buf),stdin)!=NULL && i < 128){ 42 sscanf(buf,"%d %d",&p.x, &p.y); 43 arr[i] = p; 44 ++i; 45 } 46 n = i; 47 radix_sort(arr, n, r, dmax); 48 return 0; 49 } 50

プログラムの概要

入力
7 3
1229427 -704
1816835 114
954607 -582
939698 -159
1882407 -873
で行なった時
2行目以降の値は座標を表しており今回はX座標を元に基数ソートをおこなう上で10進数から2^r進数に直しそれぞれの桁でバケツソートを行う。なお1行目の意味は7 ビットを 1 桁として 3 桁の数値と見て整列するという意味である。
整列の過程と結果は以下のようになる
1816835 114
1882407 -873
939698 -159
954607 -582
1229427 -704
________
1229427 -704
954607 -582
939698 -159
1816835 114
1882407 -873
_______
939698 -159
954607 -582
1229427 -704
1816835 114
1882407 -873

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

c[d[i]]++; /////////この式においてインクリメントされない。

//////////////////////////
printf("c[%d] = %d\n",d[i],c[i]);

最初のインクリメントの式と、printfしてる c[i] と別の場所を見てることはわかってるでしょうか。

投稿2018/12/11 04:57

y_waiwai

総合スコア87774

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

apeirogon0813

2018/12/11 04:59

ありがとうございます!少し解決しました
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問