• 締切済み

free関数で動作が止まる

freeしようとすると止まってしまいます。(1) q4614822の質問では用意するサイズが間違っていると起こるらしいのですが、出力に問題はないようです。スタックトレースというものをやってみたいのですが、C言語でも出来ますか? もう1つ質問ですがmerge_sortをmerge-sortで宣言するとコンパイルが通らない理由をお教え下さい。(2) 出力結果(1) 42 33 78 19 46 63 25 11 54 17 11 17 19 25 33 42 46 54 63 78 ^C←ここで止まります。 出力結果(2) Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland main.c: エラー E2449 main.c 5: 'merge' のサイズが不明、あるいはゼロ エラー E2141 main.c 5: 宣言の構文エラー エラー E2356 main.c 6: 'merge' の再宣言で型が一致していない エラー E2344 main.c 5: 一つ前の 'merge' の定義位置 警告 W8065 main.c 15: プロトタイプ宣言のない関数 'sort' の呼び出し(関数 main ) 警告 W8019 main.c 15: コードは効果を持たない(関数 main ) エラー E2356 main.c 23: 'merge' の再宣言で型が一致していない エラー E2344 main.c 6: 一つ前の 'merge' の定義位置 エラー E2449 main.c 30: 'merge' のサイズが不明、あるいはゼロ エラー E2356 main.c 30: 'merge' の再宣言で型が一致していない エラー E2344 main.c 23: 一つ前の 'merge' の定義位置 エラー E2141 main.c 30: 宣言の構文エラー *** 10 errors in Compile *** #include<stdio.h> #include<stdlib.h> #define N 10 void merge_sort(int,int); void merge(int,int); int a[N]={42,33,78,19,46,63,25,11,54,17}; int *b; int main(){ int i=0; b=(int*)malloc(sizeof(int)*N); while(i<N)printf("%3d",a[i++]); printf("\n"); merge_sort(0,N-1); free(b); i=0; while(i<N)printf("%3d",a[i++]); printf("\n"); return 0; } void merge(int left,int right){ int half=(right+left-1)/2,i=left,j=half+1,k; for(k=0;k<left+right+1;k++){ if((i<=half)&&(a[i]<a[j]||j==right+1))b[left+k]=a[i++]; else b[left+k]=a[j++]; } } void merge_sort(int left,int right){ if(left<right){ int half,k; half=(right+left-1)/2; merge_sort(left,half); merge_sort(half+1,right); merge(left,right); for(k=left;k<=right;k++)a[k]=b[k]; } }

みんなの回答

  • maiko0318
  • ベストアンサー率21% (1483/6970)
回答No.9

> 19 33 42 46 63 25 11 54 17 78 >↑こうなります 結果は 42 33 78 19 46 63 25 11 54 17 11 17 19 25 33 42 46 54 63 78 でしたが?あれっ?

jororo0
質問者

補足

写し間違えがありました。申し訳ありません。 right以降の余分な走査はコピーしているだけなので、問題はありませんね。

回答No.8

maiko0318さん、むっちゃがんばったね^^ 最後に、質問とは無関係ですが、 int *b; この”グローバル” あまり美しくないので、 void merge(int *b,int left,int right) ;; void merge_sort(int *b,int left,int right) ;; と中で消化させるようにすれば、 拡張性があがり、便利ですよ! (ここは好みなので、ただの参考に。だけです。)

jororo0
質問者

補足

ありがとうございます。 その点に関してはすでに改良してまして、merge_sortからmergeへ渡す方式に変更しております。

  • maiko0318
  • ベストアンサー率21% (1483/6970)
回答No.7

void merge(int left,int right){ int half=(right+left-1)/2,i=left,j=half+1,k; for(k=0;k<N-left;k++){                  終了条件変更 if((i<=half)&&(a[i]<a[j]||j==right+1))b[left+k]=a[i++]; else b[left+k]=a[j++]; } } これでうまくいく

jororo0
質問者

補足

ご回答ありがとうございます。 19 33 42 46 63 25 11 54 17 78 ↑こうなります 不正アクセスはありませんが、余分に回す場合が出てくるのでうまくはいかなかったです。

  • maiko0318
  • ベストアンサー率21% (1483/6970)
回答No.6

void merge(int left,int right){ int half=(right+left-1)/2,i=left,j=half+1,k; for(k=0;k<left+right+1;k++){ if((i<=half)&&(a[i]<a[j]||j==right+1))b[left+k]=a[i++]; else b[left+k]=a[j++]; } } ここでleft+kは9を超えます。ちなみに26まで使います。 b=(int*)malloc(sizeof(int)*N*3);  ここで、bを30個作るとfree(b)は問題無いです。

  • maiko0318
  • ベストアンサー率21% (1483/6970)
回答No.5

原因を特定しました。 #include<stdio.h> #include<stdlib.h> #define N 10 void merge_sort(int,int); void merge(int,int); int a[N]={42,33,78,19,46,63,25,11,54,17}; int b[N];                  普通の配列で良いのでは? int main(){ int i=0; //b=(int*)malloc(sizeof(int)*N);       不要 while(i<N)printf("%3d",a[i++]); printf("\n"); merge_sort(0,N-1); //free(b);                   不要 i=0; while(i<N)printf("%3d",a[i++]); printf("\n"); return 0; } void merge(int left,int right){ int half=(right+left-1)/2,i=left,j=half+1,k; for(k=0;k<half+1;k++){                  終了は k<half+1 if((i<=half)&&(a[i]<a[j]||j==right+1))b[left+k]=a[i++]; else b[left+k]=a[j++]; } } void merge_sort(int left,int right){ if(left<right){ int half,k; half=(right+left-1)/2; merge_sort(left,half); merge_sort(half+1,right); merge(left,right); for(k=left;k<=right;k++)a[k]=b[k]; } }

jororo0
質問者

お礼

ありがとうございます。 left+right+1だと普通に考えてサイズ超えますよね なんでこんな当たり前のことに気付かなかったのか…

  • maiko0318
  • ベストアンサー率21% (1483/6970)
回答No.4

merge内 for(k=0;(k<left+right+1);k++){ printf("\npoint3:left=%d,k=%d,i=%d,j=%d,half=%d",left,k,i,j,half); if((i<=half)&&(a[i]<a[j]||j==right+1))b[left+k]=a[i++]; else b[left+k]=a[j++]; } このループ、aやbの[]内が9を超えています。 試しにa[20],bも20個用意したらきちんと終わりました。

回答No.3

>出力結果(1) >42 33 78 19 46 63 25 11 54 17 >11 17 19 25 33 42 46 54 63 78 >^C←ここで止まります。 GCC にてコンパイルしてみました。 >42 33 78 19 46 63 25 11 54 17 この直後、コアダンプを吐いてます(つまりスタックを壊したということ) >merge_sortをmerge-sort merge + (-sort) つまり、mergeやsortは変数名になっちゃいますよ。 void merge(int left,int right){ ~~~~~~~ if((i<=half)&&(a[i]<a[j]||j==right+1))b[left+k]=a[i++]; ~~~~~~~ } ここなんですが、 void merge(int left,int right){ int half=(right+left-1)/2,i=left,j=half+1,k; for(k=0;k<left+right+1;k++){ if((i<=half)&&(a[i]<a[j]||j==right+1)){ if (left+k>=N) printf("left=%d k=%d\n",left,k); b[left+k]=a[i++]; } else { if (left+k>=N) printf("left=%d k=%d\n",left,k); b[left+k]=a[j++]; } } } bのサイズを大きく超えるエリアの配列へアクセスしています。 left=8 k=17 ですら呼ばれているのを確認しました。 質問は、スタックトレースのやり方でしたが、BCCは所有していないので、 わかりませんでしたが、 こんな感じで、ポインタ変数へのエリアチェックをするだけでも、 相当ヒントになるので、一度お試しください。 何をするプログラムかは、見てないので、もっと簡単な ”答え”があるのかについては、見ていない回答になります。

jororo0
質問者

お礼

ありがとうございます。 丁寧に出力を見ながらデバッグしてみたところ、問題なく動いてくれました。 今はもう少し読みやすいコードになるよう努めております。

  • maiko0318
  • ベストアンサー率21% (1483/6970)
回答No.2

動かしてみました。問題はfree(b);ではなく、merge_sort(0,N-1);のようです。 (merge_sort(0,N-1);をコメントアウトしたら正常終了しました) 複雑なロジックですので、今わかっているのは以上になります。 こちらの環境win7,vs2013

回答No.1

>もう1つ質問ですがmerge_sortをmerge-sortで宣言するとコンパイルが通らない理由をお教え下さい。(2) 「merge-sort」は、「merge引くsort」と解釈されるから。

jororo0
質問者

お礼

関数名内を式として認識するのは初めて聞きました。 ありがとうございます。

関連するQ&A

  • クイックソート

    クイックソートのプログラムを作ったのですがうまくいきません 汗 コンパイル時に sample1.c: In function ‘quicksort’: sample1.c:31: error: expected expression before ‘]’ token sample1.c:32: error: expected expression before ‘]’ token sample1.c:32: error: too few arguments to function ‘quicksort’ とでます。 まだアルゴリズムやCは勉強始めたばかりで基本的なところでつまって いるかもしれません。ご教授おねがいします。 /*クイックソート*/ #include<stdio.h> #define MAXDATA 10 #define swap(type,a,b) {type m; m = a; a = b; b = m;} void quicksort(int a[],int left ,int right) { int i,j,pivot; pivot = a[left]; i = left + 1; j = right; while(i <= j){ while(a[i]<pivot) i++; while(a[j]>pivot) j--; if(i<j){ swap(int,a[i],a[j]); i++; j--; } } swap(int,a[left],a[j]); quicksort(a[],left,j-1); quicksort(a[],j+1,right); } int main(void) { int k,j,sort[MAXDATA]; for(k=0;k < MAXDATA;k++) {printf("sort[%d]:",k); scanf("%d",&sort[k]);} for(k=0;k < MAXDATA;k++) printf("%3d",sort[k]); puts("ソートしますか? Yes:1 No:0 ///"); scanf("%d",&j); if(j==1){ quicksort(sort,0,MAXDATA-1); for(k=0;k < MAXDATA;k++) printf("%3d",sort[k]); } putchar('\n'); return(0); }

  • マージソート

    マージソートの実行時間を測定するプログラムを書いています。 コンパイルの時にはエラーが出ないのですが、実行するとコマンドプロンプトが強制終了されます。 どこが悪いか、どう直せばいいのか指摘していただけないでしょうか? よろしくお願いします。 ~qtime.c~ //マージソート実行用プログラム //bcc32 mtime.c merge.c m1.c sfmt.c #include <stdio.h> #include <stdlib.h> #include <time.h> #include "sfmt.h" #define MAX 5000 void merge_sort(int a[], int start, int end); main() { int i , x[MAX] , n; time_t start , end ; int sn; printf("適当な数字の入力 : "); scanf("%d", sn); init_gen_rand(sn); for(i=0; i<MAX; i++) x[i]= (gen_rand32()% MAX);; n=MAX; start = clock(); //測定対象プログラム merge_sort(x, 0, n-1); end = clock(); printf("sort\n"); for(i =0 ; i < n ; i++ ) if ( i == i/100*100) printf("%d\n" , x[i]); printf ("実行時間: %f sec\n" , (double)(end-start) /CLOCKS_PER_SEC); return 0; } ~merge.c~ int b[100]; void merge_array(int x[], int start, int end) { int mid, i, j, k; mid = (start + end) /2; i = start; j = mid + 1; for(k = start; k <= end; k++){ if(x[i] > x[j] && j <= end || i > mid){ b[k] = x[j]; j++; } else{ b[k] = x[i]; i++; } } for(k = start; k <= end; k++){ x[k] = b[k]; } } ~m1.c~ void merge_array(int x[], int start, int end); void merge_sort(int a[], int start, int end); void merge_sort(int a[], int start, int end) { int mid; if(start >= end) return; mid = (start + end) / 2; merge_sort(a, start, mid); merge_sort(a, mid + 1, end); merge_array(a, start, end); }

  • マージソートのプログラム

    ↓が自分の作ったマージソートのプログラムなのですが、コンパイルするとエラーが起きてしまいます。 mergesort()にポインタを引数として渡してる、引数の数が足りない、ということが書いてありますが…。 ちゃんとint型を渡してるし、引数の数も合ってるように思います。 どこがおかしいのでしょう? #include<stdio.h> #include<stdlib.h> #include<time.h> #define Max 255 int A[Max]; main(){ int n,k; n=inputdata(); int w=1; mergesort(w,n); printdata(n); return(0); } inputdata(){ //配列に乱数を要素として入れていく int n,i; printf("n= "); scanf("%d",&n); //使用者にいくつの要素を入れるか指定してもらう srand(time(NULL)); for(i=1; i<=n; i++){ A[i]=1+rand()%30; } printf("A[%d]={%d,",n,A[1]); for(i=2;i<n;i++) printf("%d,",A[i]); printf("%d}\n",A[n]); return(n); } void mergesort(int p, int r){ int q; if(p<r){ q=(p+r)/2; mergesort(p,q); mergesort(q+1,r); merge(p,q,r); } } void merge(int p, int q, int r){ int i,j,k,B[Max]; i=p; j=q+1; for(k=p;k<=r;k++){ if((j>r) || ((i<=q)&&(A[i]<=A[j]))){ B[k]=A[i]; i++; }else{ B[k]=A[j]; j++; } } for(k=p; k<=r; k++) A[k]=B[k]; } printdata(int n){ int i; printf("A[%d]={%d,",n,A[1]); for(i=2; i<n; i++) printf("%d,",A[i]); printf("%d}\n",A[n]); } ・エラーメッセージ merge1.c: In function ‘main’: merge1.c:12: warning: passing argument 1 of ‘mergesort’ makes pointer from integer without a cast merge1.c:12: error: too few arguments to function ‘mergesort’ merge1.c: At top level: merge1.c:31: error: conflicting types for ‘mergesort’ /usr/include/stdlib.h:294: error: previous declaration of ‘mergesort’ was here merge1.c:41: warning: conflicting types for ‘merge’ merge1.c:37: warning: previous implicit declaration of ‘merge’ was here

  • クイックソート(C言語)

    こんにちは<_ _> クイックソートについての質問です。 左端を軸にクイックソートでデータを昇順にソートする プログラムを作ったのですがうまく動きません #include<stdio.h> void quick(int *,int,int); #define N 10 int main(void) { static int a[]={41,24,76,11,45,64,21,69,19,36}; int k,b=0; quick(a,0,N-1); for(k=0;k<N;k++) printf(" %d",a[k]); return 0; } void quick(int a[],int left,int right) { int s,t,i,j; t=right; i=left+1; j=a[left]; if(right>left){ while(1){ while(a[++i]>j); while(a[--t]<j && t>0); if(i>=t){ break; } s=a[i]; a[i]=a[t]; a[t]=s; } s=a[i]; a[i]=j; a[left]=s; quick(a,left,t-1); quick(a,t+1,right); } } 値の入れ替え、軸の入れ替えもしましたが結果として 「41 41 76 69 45 64 41 19 0 36」 このような結果で出力されてしまいます・・・ 時間に余裕のある方いましたらご指導をお願いします。 よろしくお願いします。<_ _>

  • 二分法のプログラム

    関数x^3-7x^2-6x+2を二分法で解くプログラムを作ったのですが、エラーが出てコンパイルできません。訂正箇所を教えて下さい。 宜しくお願い致します。 #include<stdio.h> #include<math.h> #define EPSILON 0.1E-5 #define TURE 1 #define FALSE 0 int kansu(int x); void Nibunho(left,right,sol,flag); double left,right; int flag; int main(void) { printf("区間の左端と右端は?\n"); scanf("%lf %lf",&left,&right); flag=FALSE; Nibunho(left,right,&root,&flag); if(flag) printf("解 = %e (繰り返し回数 = %d)\n",root,k); else { printf("入力した範囲で解は求まりませんでした。\n"); printf("f(%e) = %e \n",root,k); } return 0; } int kansu(int x) { int f(double x) f(x)=x*x*x-7.0*x*x-6.0*x+2.0; return(f(x)); } void Nibunho(left,right,sol,flag) { double left,right,*sol; int *flag; double a,b,c,fa,fb,fc; k=0; a=left; b=right; do { k++; c=(a+b)/2.0; fc=f(c); fa=f(a); fb=f(b); if(fabs(fc)<1.0e-10) { a=c; b=c; *flag=TRUE; } else { if( (fa * fc < 0.0) || (fb * fc < 0.0) ) { *flag = TRUE; if( (fa*fc) < 0.0 ) b=c; else a=c; } else { if( fabs(fa) > fabs(fb) ) a=c; else b=c; } } } while((b-a)>EPSILON) *sol=(a+b)/2.0; }

  • 関数化について

    何度も質問しているんですがまた行き詰ってしまいました 以前解答をいただき自分なりに進めていき以下のことができるようになりました 1、多項式の係数を入力し、多項式(A)をつくる。 2、それを微分したもの(A’)で割る。→A÷A’=商・・・余りB 3、出てきた余り(B)を割る数、ひとつ前の作業で割る数だったもの(A’)を割られる数にする。 4、割る数(B)の最高次の係数の2乗をしたもの(a^2)を割られる数(A’)にかける。(擬除法) 5、割り算を行う。→(a^2)×A’÷B 6、余りが0になるまで3~5を繰り返す。(0にならなければ終わり) 7、割り切れたときの割る数がAとA’の最大公約数Dとなる(正確には最大公因数?) とここまでできるようになりました。 で、次にさらにまた 8、A÷D=E 9、DとEでユークリッドの互除法により最大公約数Gを求める 10、E÷G=P→PがAのi次の平方因子 11DをAとしDが無平方になるまで1~10を繰り返す。 といったことをやらなければいけないんですが、 いい加減関数を使わないと長すぎるので同じ作業を簡略化するため関数化することにしました。 で、微分のプログラムは関数化できたんですが、ユークリッドの互除法のプログラムが難しくて関数化できません。 わかる方お願いしますm(_ _)m 以下プログラム #include <stdio.h> #include <math.h> int main(void){ int m,m2,i,j,k,l,n,p,q; int a[1000],b[1000],c[1000],d[1000],e[1000]; puts("何次の多項式ですか?"); printf("何次:"); scanf("%d",&m); puts("多項式の係数を入力してください。"); for(i=m;i>=0;i--){ scanf("%d",&a[i]); //e[i]=a[i]; //printf("e[i]=%d\n",e[i]); } derivative(&m,a,&m2,b); printf("微分された多項式は:"); for(i=m2;i>=0;i--){ printf("%dx^%d+ ",b[i],i); } printf("\n\n"); q = 1; l = 0; while(q == 1){ printf("割られる数は:"); for(i=m;i>=0;i--){ a[i]=a[i]*(b[m2]*b[m2]); printf("%dx^%d + ",a[i],i); } q = 0; printf("\n上のは割る数の最高の次数の係数の2乗をかけたもの:b[m2]=%d\n",b[m2]); printf("--\n"); printf("%d回目の商は\n",l+1); for(k=m-m2;k>=0;k--){ c[k] = a[m - (m - m2 - k)] / b[m2]; printf("%dx^%d + ",c[k],k);//商の表示 j = m2; for(i = m - (m - m2 - k);i>= m - (m - m2 - k) - m2 ;i--){ d[i]=a[i]-c[k]*b[j]; a[i] = d[i]; j = j - 1; } } printf("\n"); for (k = m2;k >=0 ;k--){ a[k] = b[k]; } printf("余り:"); for (k = m2-(m-m2);k >=0 ;k--){ b[k] = d[k]; printf("%dx^%d + ",b[k],k); if (d[k] != 0){ q = 1; } } for (k = 0;k <= 1000;k++){ d[k] = 0; } printf("q:%d\n",q); p = m2 - 1; m = m2; m2 = p; l = l + 1; printf("\n"); while(b[m2] == 0){ m2 = m2 - 1; } if (m2 <= 0){ break; } } if (q == 0){ printf("割り切れた"); }else{ printf("割り切れなかった"); } return(0); } int derivative(int *m, int a[],int *m2, int b[]) { int i; for(i=*m;i>0;i--){ b[i-1]=i*a[i]; } *m2=*m-1; return(0); }

  • 昇順と降順

    C言語でクイックソートを行うプログラムを探していたところ、希望していたものが見つかりました。 このプログラムは与えられた数列を昇順に並び替えるものなのですが、これを降順に並び替えるにはどうしたらよいでしょうか? いろいろ試してみたのですが、無限ループになってしまいます。 #include <stdio.h> void QSort(int x[ ], int left, int right); void Swap(int x[ ], int i, int j); void ShowData(int x[ ], int n); void main(void); /* クイックソートを行う */ void QSort(int x[ ], int left, int right) { int i, j; int pivot; i = left; /* ソートする配列の一番小さい要素の添字 */ j = right; /* ソートする配列の一番大きい要素の添字 */ pivot = x[(left + right) / 2]; /* 基準値を配列の中央付近にとる */ while (1) { /* 無限ループ */ while (x[i] < pivot) /* pivot より大きい値が */ i++; /* 出るまで i を増加させる */ while (pivot < x[j]) /* pivot より小さい値が */ j--; /* 出るまで j を減少させる */ if (i >= j) /* i >= j なら */ break; /* 無限ループから抜ける */ Swap(x, i, j); /* x[i] と x[j]を交換 */ i++; /* 次のデータ */ j--; } ShowData(x, 10); /* 途中経過を表示 */ if (left < i - 1) /* 基準値の左に 2 以上要素があれば */ QSort(x, left, i - 1); /* 左の配列を Q ソートする */ if (j + 1 < right) /* 基準値の右に 2 以上要素があれば */ QSort(x, j + 1, right); /* 右の配列を Q ソートする */ } /* 配列の要素を交換する */ void Swap(int x[ ], int i, int j) { int temp; temp = x[i]; x[i] = x[j]; x[j] = temp; } /* n 個のデータを表示する */ void ShowData(int x[ ], int n) { int i; for (i = 0; i < n ; i++) printf("%d ", x[i]); printf("\n"); } void main(void) { /* ソートする配列 */ int x[ ] = {6, 3, 1, 7, 0, 4, 8, 5, 2, 9}; int n = 10; printf("ソート前:\n"); ShowData(x, n); printf("ソート中:\n"); QSort(x, 0, n - 1); printf("ソート後:\n"); ShowData(x, n); }

  • マージソートについて。

    マージソートについて勉強しており、プログラムを作ってみたのですが どうしてもcc=~~の箇所の数値がおかしく表示されてしまいます #include<stdio.h> int main(void) { int a[5]={20,40,15,35,50}; int b[3]={55,20,65}; int c[8]; int i,z,k; printf("a="); for(i=0;i<5;i++) { printf("%d ",a[i]); } printf("\nb="); for(z=0;z<3;z++) { printf("%d ",b[z]); } while(i <= 5 && z <= 3){ if(i < z){ a[i]=c[k]; i++; } else if(i > z){ b[z]=c[k]; z++; } } while(i<5 && z<3) { i=k; i++; z=k; z++; } printf("\nc=") ; for(k=0;k<8;k++) { printf("%d ",c[k]); } return 0; } ご教授していただければ幸いです。

  • クイックソートのアルゴリズム

    http://www1.cts.ne.jp/~clab/hsample/Sort/Sort9.html こちらにあったソースを改造しました。 #include <stdio.h> void QSort(int x[ ], int left, int right) {   int i, j, temp;   int pivot;   i = left;   j = right;   pivot = x[(left + right) / 2]; // 6,5,4,3 // pivot=4   while (1) {   while (x[i] <= pivot) i++; // サイトのソースは = が無かったから付けた // 2回目のループでは j=2   while (pivot < x[j]) j--; // 2回目のループで x[-1] を参照しませんか? // 初回ループで i=0, j=3   if (i >= j) break;   temp = x[i]; x[i] = x[j]; x[j] = temp; // 交換   i++; j--;   }   ShowData(x, 10); // 途中経過を表示   if (left < i - 1) QSort(x, left, i - 1);   if (j + 1 < right) QSort(x, j + 1, right); } void ShowData(int x[ ], int n) {   int i;   for (i = 0; i < n ; i++) printf("%d ", x[i]);   printf("\n"); } void main(void) {   int x[] = {6, 3, 1, 7, 0, 4, 8, 5, 2, 9};   int n = 10;   printf("ソート前:\n");   ShowData(x, n);   printf("ソート中:\n");   QSort(x, 0, n - 1);   printf("ソート後:\n");   ShowData(x, n); } テストデータが 6,5,4,3 だと、 2回目のループで x[-1] を参照しませんか? 今コンパイラが使えません。 教えてください。 それと、=を付けたんですが、付けないといけませんよね?

  • 挿入法

    アルゴリズムの勉強をしているものです。挿入法をCで実装してみたのですがうまくいきません 汗 プログラムは6個の配列に任意の数を入力してそれをソートするものです。 実行結果が以下のようになりうまくいきません。自分ではどこがおかしい 原因かわからないので教えてください。 a[0]:4 a[1]:2 a[2]:3 a[3]:1 a[4]:5 a[5]:6 4 2 3 1 5 6・・をソートしますか? Yes:0 No:1 --- 0 2 3 1 4 5 6 ////*挿入法*//// #include <stdio.h> void insertion-sort(int a[],int n){ int i,j,t; for(i=1;i < n;i++){ j = i; while(a[j-1] > a[j]){ t = a[j]; a[j] = a[j-1]; a[j-1] = t; j--; if(j==0) break; } } } int main(void) { int k,j,sort[6]; for(k=0;k < 6;k++) {printf("sort[%d]:",k); scanf("%d",&sort[k]);} for(k=0;k < 6;k++) printf("%3d",sort[k]); puts("ソートしますか? Yes:1 No:0 ///"); scanf("%d",&j); if(j==1){ insertion-sort(sort,6); for(k=0;k < 6;k++) printf("%3d",sort[k]); } putchar('\n'); return(0); }

専門家に質問してみよう