要素の数を事前に指定し、1~20のいずれかで作られた数字列をマージソートするプログラムなのですが、要素数Nを173643以上の数とすると実行されず、コンパイラがフリーズしてしまいます。
環境はVisual Studio CodeとMinGWなのですが、何か対処法はありますでしょうか。
C
1#include <stdio.h> 2#include <stdlib.h> 3#include <time.h> 4#define N 173642 5 6void Merge(int *S,int left,int right); 7void MergeSort(int *S,int left,int right); 8 9int main(void) 10{ 11 int i,S[N]; 12 long cpu_time; 13 14 srand((unsigned)time(NULL)); 15 for(i=0; i<N; ++i){ 16 S[i]=rand()%20+1; //1~20までの乱数生成 17 } 18 19 20 for(i=0; i<N; ++i){ 21 printf("%d ",S[i]); 22 } 23 24 printf("\n"); 25 26 cpu_time=clock(); 27 28 MergeSort(S,0,N-1); 29 30 for(i=0; i<N; ++i){ 31 printf("%d ",S[i]); 32 } 33 34 printf("\nN=%d,CPU Time: %.4f [sec]\n",N,(double)(clock()-cpu_time)/CLOCKS_PER_SEC); 35 36 return 0; 37} 38 39void MergeSort(int *S,int left,int right) 40{ 41 int mid; 42 43 mid=(left+right)/2; 44 45 if(left<right){ //配列の要素数が2以上のとき 46 MergeSort(S,left,mid); 47 MergeSort(S,mid+1,right); 48 Merge(S,left,right); 49 } 50} 51 52void Merge(int *S,int left,int right) 53{ 54 int i,mid,size_L,size_R; 55 int j=1,k=1; 56 int L[N],R[N]; 57 58 mid=(left+right)/2; 59 size_L=mid-left+1; //左側配列の大きさ 60 size_R=right-mid; //右側配列の大きさ 61 62 for(i=0; i<size_L; ++i){ 63 L[i]=S[left+i]; 64 } 65 66 for(i=0; i<size_R; ++i){ 67 R[i]=S[mid+i+1]; 68 } 69 70 for(i=1; i<=size_L+size_R; ++i){ 71 if(j>size_L){ 72 S[left+i-1]=R[k-1]; 73 ++k; 74 }else if(k>size_R){ 75 S[left+i-1]=L[j-1]; 76 ++j; 77 }else if(L[j-1]<R[k-1]){ 78 S[left+i-1]=L[j-1]; 79 ++j; 80 }else{ 81 S[left+i-1]=R[k-1]; 82 ++k; 83 } 84 } 85}
コンパイラの表示は以下のようになり、次の入力を促されてしまいます。
…
N=173642,CPU Time: 18.6740 [sec] //N=173642の場合実行可能
PS C:\programming> .\a.exe //N=173643にすると実行されない
PS C:\programming>
回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。