【问题标题】:Weird behaviour when merge sorting an array合并排序数组时的奇怪行为
【发布时间】:2020-12-17 12:00:23
【问题描述】:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/time.h>
#include <time.h>

void DISPLAY(int*, int);

int* MERGE(int*, int,  int* , int,  int* , int ); 
int* MERGESORT(int* , int ); 



int main()
{

    int* array = NULL;
    array = (int*) malloc(7 * sizeof(int) );
    
    array[0] = 10;
    array[1] = 9;
    array[2] = 8;
    array[3] = 57;
    array[4] = 6;
    array[5] = 5;
    array[6] = 24;
    
    printf("\nOriginal array: \n");
    DISPLAY(array, 7);
                
    array = MERGESORT(array, 7);
                
    printf("\n\nResulting array: \n");
    DISPLAY(array, 7);
}

void DISPLAY(int* array, int size)
{
    int i;                                          
    for(i = 0; i < size; i++){                  
        printf("%d ", array[i]);
    }
}


int* MERGESORT(int *array, int size) {
    if(size < 2) 
        return array; 

    int mid = size / 2;             
    int rightsize = size-mid;   

    int* L = (int*) malloc(mid * sizeof(int));         
    int* R = (int*) malloc((size-mid) * sizeof(int));  
    int i;
    for(i = 0; i < mid; i++) 
        L[i] = array[i];                            
    for(i = mid; i < size; i++) 
        R[i-mid] = array[i];                    

    L = MERGESORT(L, mid);                           
    R = MERGESORT(R, size-mid);                     
    array = MERGE(array, size, L, mid, R, rightsize);       
    free(L);                                        
    free(R);                                    
    
    return array;
}


int* MERGE(int *array, int size, int *L, int leftsize,int *R, int rightsize) {
    int i, j, k;
    
    i = 0; 
    j = 0; 
    k = 0;

    while(i < leftsize && j < rightsize)    
    {                   
        if(L[i] < R[j])                     
        {
            array[k] = L[i];                
            i++;                            
        }
        else{                           
            array[k] = R[j];            
            j++;                        
        }
        k++;                        
    }
    while(i < leftsize)                 
    {
        array[k] = L[i];                    
        i++;                                
        k++;                                    
    }
    while(j < rightsize)
    {
        array[k] = L[j];                
        j++;                                
        k++;                            
    }
    
    printf("\nUpdated array: \n");                       
    DISPLAY(array, size);
    return array;
}

您好,我在尝试对数组执行归并排序时遇到问题。数组中的某些项目打印得很奇怪。每次更新数组时,都会打印出该值,但它不适用于特定的输入。

当我输入小数字(如 1-2 位)时,数组会正常排序。

程序排序错误的示例运行: https://i.stack.imgur.com/OLg0b.png

【问题讨论】:

  • 以此为契机,学习如何使用调试器在监控变量及其值的同时逐语句执行代码。
  • 提示:在a = malloc(n * sizeof *a)中,只能通过a[n-1]引用a[0]。
  • 在malloc((size-mid) * sizeof(int)) 中为什么不使用rightsize 而不是size - mid?当您致电MERGESORT(R, size-mid) 时也是如此。我还建议您开始对大小和索引使用无符号类型,最好是size_t。

标签: c mergesort


【解决方案1】:
while(j < rightsize)
    {
        array[k] = L[j];                
        j++;                                
        k++;                            
    }

应该是

while(j < rightsize)
        {
            array[k] = R[j];                
            j++;                                
            k++;                            
        }

嗯,很抱歉在这么简单的错误上浪费时间。

【讨论】:

    【解决方案2】:

    考虑一下。

    int* R = (int*) malloc((size-mid) * sizeof(int)); 
    

    (应该写成int *R = malloc((size - mid) * sizeof *R);)

    该数组中的最高有效索引是多少?尝试读取(或写入)R[n] for n > size - mid - 1 会调用未定义的行为。

    【讨论】:

      猜你喜欢
      • 2023-03-16
      • 2020-09-17
      • 2019-12-13
      • 1970-01-01
      • 2012-01-27
      • 1970-01-01
      • 2019-12-22
      • 2011-03-13
      • 1970-01-01
      相关资源
      最近更新 更多