Ошибка Mergesort + предупреждения - PullRequest
0 голосов
/ 17 октября 2018

У меня есть следующий код, после которого он сформировал учебник, и он, похоже, ничего не делает.Я попытался отладить его с помощью KDB, но не могу найти проблему, почему он не сортируется.

Может быть, кто-то здесь может мне помочь, заранее спасибо!

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

void Mergesort(int *a, int length) {
    int i = 0;
    int mid = 0;
    int *L, *R;
    mid = length / 2;
    if (length < 2)
        return;
    else {
        L = (int*)malloc(sizeof(int) * mid);   
        R = (int*)malloc(sizeof(int) * (length - mid));
        for (i = 0; i < mid; i++) {
            L[i] = a[i];
        }
        for (i = mid; i < length; i++) {
            R[i - mid] = a[i];
        }
        Mergesort(L, mid);
        Mergesort(R, length - mid);
        Merge(a, L, R, length);
    }
}

void Merge(int *a, int *L, int *R, int length) {
    int i = 0, j = 0, k = 0;
    int mL, mR;
    mL = length / 2;
    mR = length - mL;

    while (i < mL && j < mR) {
         if (L[i] < R[j]) {
             a[k] = L[i];
             i++;
         } else {
             a[k] = R[j];
             j++;
         }
         k++;
    }
    while (i < mL) {
        a[k] = L[i];
        i++;
        k++;
    }
    while (j < mR) {
        a[k] = R[j];
        i++;
        k++;
    }
}

void main() {
    int a[7] = { 5, 4, 99, 13, 34, 54, 2 };
    int u = 0;
    Mergesort(a, 7);     // call to Mergesort

    for (u = 0; u < 7; u++) {
        printf(" %d\t", a[u]);   
    }
    printf("\n\n\n");
}   

Я бы хотелочень ценю это, так как мне нужно понять это до четверга следующей недели: P

1 Ответ

0 голосов
/ 17 октября 2018

Здесь вы увеличиваете i, но вам следует увеличить j в Merge функции.

 while(j<mR)
        {
        a[k]=R[j];
        j++;
        k++;
        }

Редактировать:

поставить функцию удаления после заголовочных файлов void Merge(int *a,int *L,int *R,int length); в противном случае вы получите implicit declaration of function ‘Merge’ предупреждение.

#include<stdio.h>
#include<stdlib.h>
void Merge(int *a,int *L,int *R,int length);

//rest of your code
...