我找到了
python的答案,但我不明白.
代码是修改后的合并排序.对于我检查到的少量输入,它工作得很好.但是当我通过在线判断运行时,当输入数量很高(500)时,它给了我这个错误:
Error in 'a.out': corrupted size vs. prev_size: 0x0000000000d5b8b0 ======= Backtrace: ========= /lib/x86_64-linux-gnu/libc.so.6(+0x777e5)[0x7f3b83a5b7e5] /lib/x86_64-linux-gnu/libc.so.6(+0x80dfb)[0x7f3b83a64dfb] /lib/x86_64-linux-gnu/libc.so.6(cfree+0x4c)[0x7f3b83a6853c] a.out[0x4009d1] a.out[0x400ac7] a.out[0x400a87] a.out[0x400aa4] a.out[0x400a87] a.out[0x400bc7] /lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xf0)[0x7f3b83a04830] a.out[0x4005b9] ======= Memory map: ========
它还有15行.为什么我收到此错误?是因为我在使用malloc动态分配内存时出现的一些错误?
这是我的代码:
#include <stdio.h> #include <stdlib.h> void *Merge(int *A,int l,int m,int r,int *B,int *F); void *Merge(int *A,int *F){ int i=l,j=m,k=0,*C,x,y=l,z,cSize,temp,*D,*E; cSize = r-l; C = (int *) malloc (cSize * sizeof(int)); D = (int *) malloc (cSize * sizeof(int)); E = (int *) malloc (cSize * sizeof(int)); while (k < cSize){ if((j==r) || ((i!=m) && ((A[j]*B[i]) >= (A[i]*B[j])))){ C[k] = A[i]; D[k] = B[i]; E[k] = F[i]; i++; k++; } if((i>=m) || ((j!=r) && ((A[j]*B[i]) < (A[i]*B[j])))){ C[k] = A[j]; D[k] = B[j]; E[k] = F[j]; j++; k++; } } for(x=0;x<k;x++){ A[y] = C[x]; B[y] = D[x]; F[y] = E[x]; y++; } free(C); free(D); free(E); } void *MergeSort(int *A,int left,int right,int *C); void *MergeSort(int *A,int *C){ int mid,i,j,l=0,*R,*L; if(right - left == 1){ A[left] = A[left]; } if(right-left > 1){ mid = (left+right)/2; MergeSort(A,left,mid,B,C); MergeSort(A,right,C); Merge(A,C); } } int main(){ int n,i=0,newNumt,newNumo,*a,*b,*c; scanf("%d",&n); a = (int *) malloc (n * sizeof(int)); b = (int *) malloc (n * sizeof(int)); c = (int *) malloc (n * sizeof(int)); for(i=0;i<n;i++){ scanf("%d %d",&a[i],&b[i]); c[i]= i+1; } MergeSort(a,n,b,c); for(i=0;i<n;i++){ printf("%d\n",c[i]); } return 0; }
解决方法
我不知道它是否可以提供帮助,但是这里有QuickSort的代码,根据Google的说法,它比MergeSort更好:
#include <stdio.h> #include <stdlib.h> #include <string.h> void Swap(int array[],int i,int j) { int temp; temp = array[i]; array[i] = array[j]; array[j] = temp; } void QuickSort(int array[],int beg,int end) { int pivot,k,e; while(beg < end) { b = beg; k = (beg+end)/2; e = end; pivot = array[k]; while(1) { while((b <= e) && (array[b] <= pivot)) b++; while((b <= e) && (array[e] > pivot)) e--; if(b > e) break; Swap(array,e); if(k == e) k = b; b++; e--; } array[k]=array[e]; array[e]=pivot; e--; if((e-beg)<(end-b)) { QuickSort(array,beg,e); beg = b; } else { QuickSort(array,end); end = e; } } return ; } void display(int * array,int n) { for(int i = 0; i < n ; i++) { printf("%d\n",array[i]); } } int main() { int array[] = {1,2,77,5,42,33,4,12,21,55}; QuickSort(array,sizeof(array)/sizeof(int)); display(array,sizeof(array)/sizeof(int)); return 0; }
也许问题存在于main函数中,您应该传递您尝试使用sizeof(array)/ sizeof(int)排序的数组的大小.看看它是否有帮助.