2014-12-16 4 views
-3

l & h соответствует индексам 1-го & Последние элементы в массиве a: - Индивидуальные разделы и функции слияния работают хорошо. Объясните ошибку, возникающую при связывании двух функций.Не удается обнаружить ошибку в Mergesort

#include <stdio.h> 
void mergesort(int a[], int l, int h); 
void merge (int a[], int l, int m, int h); 
int main() 
{ 
    int a[] = {5,4,9,0,8,6,1,3,2,7}, i; 
    mergesort (a, 0, 5); 
    for (i = 0; i < 10; i++) 
     printf ("%d ", a[i]); 
    return 0; 
} 
void mergesort(int a[], int l, int h) 
{ 
    if (l == h) 
    return; 
    int m = (l + h)/2; 
    mergesort (a, l, m); 
    mergesort (a, m + 1, h); 
    merge(a, l, m, h); 
} 
void merge (int a[], int l, int m, int h) 
{ 
    int t[h - l + 1], i = l, j = m + 1, k = 0; 
    while (i <= m && j <= h) { 
     if (a[i] < a[j]){ 
      t[k] = a[i]; 
      k++; 
      i++; 
     } 
     if (a[j] < a[i]) { 
      t[k] = a[j]; 
      j++; 
      k++; 
     } 
    } 
    if (i != m) { 
     while (i <= m) { 
      t[k] = a[i]; 
      k++; 
      i++; 
     } 
    } 
    if (j != h) { 
     while (j <= h) { 
      t[k] = a[j]; 
      k++; 
      j++; 
     } 
    } 
    for (i = 0; i <= (h - l); i++) 
     a[l + i] = t[i]; 
    } 

Вместо желаемого выхода

0 4 5 6 8 9 1 3 2 7 

(элементы от 0 до 5 включительно стали отсортированы), она производит некоторое количество мусора вроде

0 4 6 9 2686712 32 1 3 2 7 
+0

Добро пожаловать в SO !! Пожалуйста, отформатируйте свой код. –

+0

Можете ли вы хотя бы объяснить, почему это не работает, ввод, вывод и ожидаемый результат? –

ответ

1

Линии if (i != m) и if (j != h) должны быть if (i <= m) и if (j <= h).

Кроме того, вы можете опустить их также, потому что они являются избыточными (оставьте только условия while). Меньше кода, меньше ошибок.

Смежные вопросы