合并排序停止运行

时间:2014-10-18 18:36:48

标签: c sorting merge

所以我的问题是,当我尝试运行我的合并排序算法时,它会在屏幕上写入随机数组,但是当它尝试编写已排序的数组时,程序就会停止工作。我一直在努力找到我的错误但到目前为止没有希望。感谢任何帮助。

这是我的代码;

#include <stdio.h>
#include <stdlib.h>

#define LEN 300
#define INF 30000

void merge (int *A, int p, int q, int r){
     int i, j, k, n1 , n2 , *L, *R;

     n1 = q - p + 1;
     n2 = r - q;
     L = (int *) malloc (n1* sizeof (int ) + 1);
     R = (int *) malloc (n2* sizeof (int )) ;
     for (i = 0; i < n1; i++) {
         L[i] = A[p + i];
     }
     for (j = 0; j < n2; j++) {
         R[j] = A[q + 1 + j];
     }
     i = j = 0;
     L[n1] = R[n2] = INF ;

     for (k = p; k < r; k++) {
         if(L[i] <= R[j]){
                 A[k] = L[i];
                 i ++;
         }
         else{
              A[k] = R[j];
              j ++;
         }
     }
     free(L);
     free(R);
}

void mergesort (int *A, int p, int r){
     int q;
     if(r > (p + 1)){
          q = (p + r)/2;
          mergesort(A, p, q);
          mergesort(A, q + 1, r);
          merge(A, p, q, r);
     }
}

void sorting_merge(int *A, int n){
     mergesort (A, 0, LEN);
}

int main (){
    int i, *n;
    n = malloc ( sizeof (int )*LEN );
    srand (666) ;
    for (i = 0; i < LEN ; i++) {
        n[i] = rand() % 1000;
        printf ("%d ", n[i]);
    }
    printf ("\n");

    sorting_merge(n, LEN);
    for (i = 0; i < LEN ; i++) {
        printf ("%d ", n[i]);
    }
    printf ("\n");
    free (n);

    system("PAUSE");
    return 1;
}

2 个答案:

答案 0 :(得分:0)

L[n1] = R[n2] = INF ;访问超出分配的内存。您的分配应该是

L = malloc((n1 + 1) * sizeof (int));
R = malloc((n2 + 1) * sizeof (int));

如果您真的想要访问索引n1n2

我还没有检查过任何其他事情,这是我眼中出现的第一件事。

答案 1 :(得分:0)

更改为

L = (int *) malloc((n1+1)* sizeof(int));
R = (int *) malloc((n2+1)* sizeof(int));

for (k = p; k <= r; k++) {//include r

if(r > p){

void sorting_merge(int *A, int n){//call sorting_merge(n, LEN); note LEN is out range
    mergesort (A, 0, n-1);
}
相关问题