前提・実現したいこと
基数ソートのプログラムにおいてある配列を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
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/12/11 04:59