【问题标题】:Merge sort stops running合并排序停止运行
【发布时间】:2014-10-18 18:36:47
【问题描述】:

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

这是我的代码;

#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;
}

【问题讨论】:

  • 您应该更具体地了解您遇到的错误以及它们发生的位置。
  • 这听起来像是学习使用调试器的绝佳机会。
  • 好吧,我尝试在 dev c++ 上使用调试器,但无法运行它。 ^^ 在我更改“R = (int ) malloc (n2 sizeof (int)) ;”之后到“R = (int ) malloc (n2 sizeof (int) + 1) ;”该程序运行得很好,但没有正确排序。我想我搞砸了……
  • malloc (n2 sizeof (int ) + 1) 不正确。 malloc((n2+1)*sizeof (int))malloc(n2*sizeof(int) + sizeof(int))
  • 按照您的建议进行更改后,程序仍然运行,但最后仍然给出未排序的数组。我想我在某些函数参数上犯了错误。

标签: c sorting merge


【解决方案1】:

改成

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);
}

【讨论】:

    【解决方案2】:

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

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

    如果你真的想访问索引n1n2

    我没有检查其他任何东西,这是我眼中的第一件事。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-03-08
      • 1970-01-01
      • 1970-01-01
      • 2018-04-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-19
      相关资源
      最近更新 更多