• 締切済み

クイックソートとチェックプログラム

こんにちは。以下の問題がわかりません。 特にint Check(){}にはいる部分が。 わかる方、ご回答願います。 /* QuickSortを完成させよう 【自動的に出てきた数を小さい順に並べ、それをチェックする】*/ #include <stdio.h> #include <stdlib.h> int a[1000000]; void MakeData(int *a,int n){ int i; srand(time(&i)); for(i=0;i<n;i++){a[i]=rand();} } int Divide(int *a, int Top, int Botom){ int x,y; while(Top<Botom){ if(a[Top]>a[Top+1]){ x=a[Top]; a[Top]=a[Top+1]; a[Top+1]=x; Top=Top+1; } else{ y=a[Top]; a[Top]=a[Botom]; a[Botom]=y; Botom=Botom-1; } } } int Check(/*ここの関数を作れ*/){/*ここの関数を作れ*/} void QuickSort(int *a, int Top, int Botom){ int K; if(Top>=Botom){return;} K=Divide(a,Top,Botom); QuickSort(a,Top,K-1); QuickSort (a,K+1,Botom); } main(){ int N; printf("データ数?");scanf("%d",&N); MakeData(a,N); if(Check(a,N)==1){printf("並べ変わっている\n");} else{printf("並べ変わっていない\n");} QuickSort(a,0,N-1); if(Check(a,N)==1){printf("並べ変わっている\n");} else{printf("並べ変わっていない\n");} }

  • 11_15
  • お礼率33% (3/9)

みんなの回答

  • arain
  • ベストアンサー率27% (292/1049)
回答No.5

> 丸投げしたわけではありません((汗)) と書かれても、かなり疑問に思うところがあるんだよね。 No.2より >えーと、int Check(){}以外のプログラムは、事前に書いた流れ図に沿って作成できたけど、肝心なint Check(){}の中身をどのように書いていいかわからないんです。 No.3より >【質問】に書いたプログラムは私が手元で書いた流れ図を元に自分で作成したものです。 ということは、ある機能について理解できているから流れ図が書けて、プログラムが途中であれできてるわけだ。 その中でCheck()に対しての引数と戻り値も決めているのに、なぜCheck()の流れ図が書けてないのかな? 流れ図っていうのは基本的に開発言語に依存しないものだよ。プログラムは流れ図に合う関数を利用したり、処理を作成するステートだから。 No.2での補足に答えてもらってないけど、Check()の機能の説明はなぜないのでしょうかね? Check()をどのようにな処理で作るか確定していなけはれば、流れ図は書けないし、引数や戻り値といったI/Fも検討できない。 「○○を行うためにはどの様な処理を作成するばよいでしょうか」といった質問が出るのであれば理解できるんだけど…… なので >if(Check(a,N)==1){printf("並べ変わっている\n");} といったプログラムも組めないはず。 これは明確にI/Fを決定しているからこそのプログラム。 という意味では、穿った見方をすると、 No.3氏が回答されているソースが質問者の意図している処理であるかという保障なくなるわけなんだけど。

  • D-Matsu
  • ベストアンサー率45% (1080/2394)
回答No.4

> 丸投げしたわけではありません((汗)) といいますが、この聞き方では「関数Check()の作成」の丸投げですよ。 ・Check()が何をする関数で ・それを作るために何(全部、はダメ)がわからないのか くらいは最低書いておかないと丸投げと取られます。以後ご注意を。 ##3氏、言葉は厳しいけど親切だよなぁ。結局答えてるし。

11_15
質問者

お礼

D-Matsuさんの言うとおりですね。言葉がかなり足りませんでした(汗)

  • chie65536
  • ベストアンサー率41% (2512/6032)
回答No.3

問題の丸投げは禁止。 >特にint Check(){}にはいる部分が。 の答えは >if(Check(a,N)==1){printf("並べ変わっている\n");} >else{printf("並べ変わっていない\n");} に書いてある。 Check(a,N) って呼んでるなら、最初の引き数は、配列の先頭要素のポインタ。次の引き数は個数。 呼んでる場所を見れば「呼んでる通りに引き数を用意してあげる」のは簡単。 なので、引き数はこうなる。 int Check(int *a,int N){ } これが判らないとしたら、小学生以下の『教えて君』のみ。 >if(Check(a,N)==1){printf("並べ変わっている\n");} って判断してるなら「並べ終わってるなら1を返し、そうじゃないなら0を返す」って事だ。 これも判らないとしたら、小学生以下の『教えて君』のみ。 あとは、関数の中身を書くだけ。 int Check(int *a,int N){ int i; for(i=0;i<N-1;i++){if (a[i]>a[i+1]) {return 0;}} return 1; } 中身はちょっと難しいかもね。

11_15
質問者

お礼

ご回答ありがとうございます。参考になりましたo(^▽^)o えーっと、問題は・・・丸投げしたわけではありません((汗)) 【質問】に書いたプログラムは私が手元で書いた流れ図を元に自分で作成したものです。 まだC言語をはじめて半年もたたないので、部分部分でわからなくなってしまうのです。

  • arain
  • ベストアンサー率27% (292/1049)
回答No.2

No.1氏の回答は理解されていますか? 「Check()関数は何を行う関数なのかわかっているか」という質問に対して >int Check(){}の中身をどうしていいのかまったくわかりません(>_<.) なら、「外」(関数の機能)はわかっているけど、「中身」(処理)の作り方がわからない という解釈でよいですよね? まずは、その理解されている関数の機能を説明してください。

11_15
質問者

補足

えーと、int Check(){}以外のプログラムは、事前に書いた流れ図に沿って作成できたけど、肝心なint Check(){}の中身をどのように書いていいかわからないんです。 C言語を始めて半年もたたないので、このような細かい部分の理解が追いつきません(>_<) 関数の機能・・・・・・並べ替えとかがちゃんとできているか確認するための関数?ですか??

  • asuncion
  • ベストアンサー率33% (2126/6288)
回答No.1

>特にint Check(){}にはいる部分が。 Check関数の仕様(機能)はわかりますか?

11_15
質問者

補足

int Check(){}以外のところは大丈夫なのですが、int Check(){}の中身をどうしていいのかまったくわかりません(>_<.)

関連するQ&A

  • チェック機能

    こんにちは。以下の問題がわかりません。 問題は・・・・・・ /* QuickSortを完成させよう 【自動的に出てきた数を小さい順に並べ、それをチェックする】*/ です。 とりあえずCが若干得意な友人とともに、プログラムを書いてみました(下記)。ついでに自分なりに考えたことも書いてみました(下記)が、どうもうまく実行されません。どこが間違っているのでしょうか? Check関数は、授業では特に習っていません(なのにCheck機能をつけなければいけないf^^;)。よって、チェック関数に関していまいちピンときません。 わかる方、どうかご回答願います! ---まずmain関数から、Check関数の戻り値が1ならば並べ替わっていて1じゃなければ並べ替わっていない、という風に判別すればいい。 だからCheck関数は、戻り値を例えばcとおいて、cが1かそれ以外の数(例えば0)になるようなプログラムにすればよい。 配列aがキチンと並んでいるということはa[i]≦a[i+1]がi=0からi=N-2まで成り立っているってこと。(ここでの=N-2は、a[N-1]までしかデータがないから最後の判別はa[N-2]≦a[(N-2)+1]) この条件が成立していれば戻り値c=1とすればよい。 逆に考えると一回でもa[i]>a[i+1]が成立したらc=0になるようにすればよい。  はじめにc=1とおいて、i=0からi<N-1までiを一つずつ増やしながら繰り返して、もしa[i]>a[i+1]が成立したらc=0となるようにプログラムをつくる  a[i]≦a[i+1]の条件で繰り返さないのは、もしa[i]≦a[i+1]が成立していたらc=1になるようなプログラムにしたら、たとえa[0]>a[1]だったとしても最後のa[N-2]≦a[(N-2)+1]さえ成立していればc=1になってしまうから。 -------------------------------------------------------------- /* QuickSortを完成させよう 【自動的に出てきた数を小さい順に並べ、それをチェックする】*/ #include <stdio.h> #include <stdlib.h> int a[1000000]; void MakeData(int *a,int n){ int i; srand(time(&i)); for(i=0;i<n;i++){a[i]=rand();} } int Divide(int *a, int Top, int Botom){ int x,y; while(Top<Botom){ if(a[Top]>a[Top+1]){ x=a[Top]; a[Top]=a[Top+1]; a[Top+1]=x; Top=Top+1; } else{ y=a[Top]; a[Top]=a[Botom]; a[Botom]=y; Botom=Botom-1; } } } int Check(int *a,int N){ int i,c; c=1; for(i=0;i<N-1;i++){if (a[i]>a[i+1]) {c=0;}} } void QuickSort(int *a, int Top, int Botom){ int K; if(Top>=Botom){return;} K=Divide(a,Top,Botom); QuickSort(a,Top,K-1); QuickSort (a,K+1,Botom); } main(){ int N; printf("データ数?");scanf("%d",&N); MakeData(a,N); if(Check(a,N)==1){printf("並べ変わっている\n");} else{printf("並べ変わっていない\n");} QuickSort(a,0,N-1); if(Check(a,N)==1){printf("並べ変わっている\n");} else{printf("並べ変わっていない\n");} } ---------------------------------------------------------------  

  • クイックソートのプログラムを実行するとエラーが出る

    プログラミング初心者のものです。 ソースのファイル名はquicksortという名前にして、コンパイル&実行すると、 「Quicksortが原因でQUICKSORT.EXEにエラーが発生しました。Quicksortは終了します。問題が解決しない場合は、コンピュータを再起動してください。」 と、 「Quicksortが原因でKERNEL32.DLLにエラーが発生しました。Quicksortは終了します。問題が解決しない場合は、コンピュータを再起動してください。」 と言うエラーが出てきて最後まで実行されません。 どうしてでしょうか?ちなみにソースは以下のものです。 #include<stdio.h> #define N 10 void quicksort(int a[],int first,int last) { int i,j,p,w,k; k=(first+last)/2; p=a[k]; i=first; j=last; while(i<=j){ while(a[i]<p){ i++; } while(a[j]>p){ j--; } w=a[i]; a[i]=a[j]; a[j]=w; i++; j--; } if(first>j){ quicksort(a,first,j); } if(last>i){ quicksort(a,i,last); } } main() { int a[]={18,97,59,72,5,38,11,43,67,26}; int i; printf("Before:"); for(i=0;i<N;i++){ printf("%4d",a[i]); } printf("\n"); quicksort(a,0,N-1); printf("After:"); for(i=0;i<N;i++){ printf("%4d",a[i]); } printf("\n"); return(0); }

  • クイックソート

    クイックソートのプログラムを作ったのですがうまくいきません 汗 コンパイル時に 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); }

  • クイックソート

    名前と年齢を入力したあとに、1人の名前を入力して2分探索で探索する プログラムを書いたのですが、これにクイックソート法の整列手続き(辞書式順序)を加えたいのですが、どこに何を加えたら動くのか教えていただけないでしょうか。 まだプログラムを習い始めたばかりでプログラム自体も、字下げもろくにできてませんが、どうかよろしくお願いします。 #include<stdio.h> #include<string.h> #include<conio.h> struct record{ char key[20] int dat; }; struct record A[100]; int n=0; void insert(char x[],int y){ n++; strcpy(A[n].key,x); A[n].dat=y; } int binarysearch(char target[],int *pos){ int top,bottom,found,pt; top=n; bottom=1; found=0; while(top>=bottom&&!found){ pt=(top+bottom)/2; if(strcmp(A[pt].key,target)>0) top=pt-1; else if (strcmp(A[pt].key,target)<0) bottom=pt+1; else found=1; } *pos=pt; return found; } int main(void){ char name[100],sname[100]; int old,ptr; scanf("%s",name); while(strcmp(name,"0")){ scanf("%d",&old); insert(name,old); scanf("%s",name); } printf("指定する名前を入力してください\n"); scanf("%s",name); if(binarysearch(sname,&ptr)){ printf("%s %d\n",A[ptr].key,A[ptr].dat); } else printf("いません。\n"); getch(); return0; }

  • クイックソートについて

    クイックソートのプログラムなんですが、 セグメンテーション違反で実行出来ません。 どこがおかしいのでしょうか? int main(void) { FILE *fp; int a[10],b=0,n; clock_t start; double jikan; if( (fp = fopen ("quicksort.txt","r") ) == NULL ) { printf("ファイルが見つかりません : quicksort.txt\n"); exit(1); } while( fscanf(fp, "%d", &a[b]) != EOF ) { b++; } start = clock(); quick_sort(a,n); jikan = clock() - start; for(n = 0; n < b ; ++n) { printf("%d ",a[n]); } printf("計算時間 %.3f 秒 \n", jikan/CLOCKS_PER_SEC); return 0; } int partition(int a[], int l, int r) { int i,j,pivot,t; i = l-1; j = r; pivot = a[r]; for(;;) { while( a[++i] < pivot ) ; while( i < --j && pivot < a[j] ) ; if( i >= j ) break; t=a[i]; a[i]=a[j]; a[j]=t; } t=a[i]; a[i]=a[r];a[r]=t; return i; } void quick_sort_1(int a[],int l,int r) { int v; if( l >= r ) return; v = partition( a, l, r); if( l < v-1 ) quick_sort_1( a, l, v-1); if( v+1 < r ) quick_sort_1( a, v+1, r); } void quick_sort(int a[],int n) { quick_sort_1( a, 0, n-1); }

  • クイックソートのプログラムについて

    一から自分なりにやってみましたが、再帰処理の部分がうまくゆきません。 改善方法をご教授願えたらと思います。 #include<stdio.h>   void qsort (int x[], int a, int b) {  int temp, kijyun, i;  kijyun = a;  i = a + 1;  while (i <= b)   {    if (x[i] < x[kijyun])     {      change (x, kijyun, i);      kijyun = kijyun + 1;     }    i++;   }  if (kijyun != 0) //基準より左側をソートする。   {    qsort (x, 0, kijyun - 1);   } //以下if文の部分で、うまくいきません。  if (kijyun != 9) //基準より右側をソートする。   {    qsort (x, kijyun + 1, 9);   } } int change (int x[], int a, int b) //x[b]をx[a]の位置に挿入させる。 {  int i, temp;  i = b;  while (i != a)   {    temp = x[i];    x[i] = x[i - 1];    x[i - 1] = temp;    i--;   } } int main (void) {  int i, x[9] = { 6, 8, 9, 5, 3, 2, 1, 4, 7 };  qsort (x, 0, 8);  for (i = 0; i != 9; i++)   {    printf ("\n%d", x[i]);   } }

  • クイックソートの交換回数

    クイックソートを行うプログラムを書いています。 これを、比較回数と交換回数を表示できるように改良したいのですが、うまくいきません。カウントする場所は間違えてないと思うのですが、出力の場所が悪いせいか、大量の出力結果が表示されます。 うまく表示させる方法を教えてください。 ~time.c~ #include <stdio.h> #include <stdlib.h> #include <time.h> #include "sfmt.h" #define MAX 5000 void quick_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(); //測定対象プログラム quick_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; } ~quick.c~ #include <stdio.h> int hikaku = 0, koukan = 0; int divide_array(int x[], int start, int end) { int i, j, tmp; i = start; j = end -1; while(1){ while(x[i] < x[end])i++; hikaku++; //比較カウント while(x[j] > x[end] && j>i)j--; hikaku++; //比較カウント if(i >= j) break; tmp = x[i]; x[i] = x[j]; x[j] = tmp; koukan++; //交換カウント i++; j--; } tmp = x[i]; x[i] = x[end]; x[end] = tmp; printf("比較回数: %d\n", hikaku); printf("交換回数: %d\n", koukan); return i; } ~quick2.c~ int divide_array(int x[], int start, int end); void quick_sort(int a[], int start, int end); void quick_sort(int a[], int start, int end) { int s; if(start >= end) return; s = divide_array(a, start, end); quick_sort(a, start, s-1); quick_sort(a, s+1, end); }

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

    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] を参照しませんか? 今コンパイラが使えません。 教えてください。 それと、=を付けたんですが、付けないといけませんよね?

  • クイックソート後の出力(pascal)

    20個の整数データをクイックソートして出力せよ、という課題が出ました。クイックソートまでは出来た(コンパイルできたのでおそらく)のですが、その順に出力する方法がわかりません。どなたかお教えください。 program sort(input,output); const n = 20; type index = 1..n; var A : array[1..n] of integer; i,x,a : integer; p,j,k : index; function PIVOT(i,j : index):integer; var k:index; begin k:=i+1; while (A[i]=A[k]) and (k<=j) do k:=k+1; if k>j then PIVOT:=0 else if A[i]>=A[k] then PIVOT:=i else PIVOT:=k end; procedure SWAP(var x,y:integer); var temp:integer; begin temp:=x; x:=y; y:=temp end; procedure PARTITION(i,j:index; a:integer; var k:index); var l,r:index; begin l:=i; r:=j; while A[l]<a do l:=l+1; while A[r]>=a do r:=r-1; while l<=r do begin SWAP(A[l],A[r]); l:=l+1; r:=r-1; while A[l]<a do l:=l+1; while A[r]>=a do r:=r-1; end; k:=l end; procedure QUICKSORT(i,j:index); var a:integer; p:index; k:index; begin p:=PIVOT(i,j); if p<>0 then begin a:=A[p]; PARTITION(i,j,a,k); QUICKSORT(i,k-1); QUICKSORT(k,j) end end; begin i:=0; i:=1+1; for i:= 1 to n do begin A[i]:=0; end; i:=0; i:=i+1; for i:= 1 to n do begin readln(x); A[i]:=x end; a:=PIVOT(p,j); PARTITION(p,j,A[a],k); QUICKSORT(p,j) end. QUICKSORT(p,j)と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

専門家に質問してみよう