2016-10-17 2 views
0

Я новый для C++ и algorithm.I запутался в алгоритме сортировки Merge, который я пишу. Я не знаю, почему код не получает правильного ответа, если у него нет ошибок. В коде я хочу сортировать 5 номеров, которые я вводил. но отсортированные массивы не печатаются на экране. Я хочу знать проблемы в моем коде. Большое спасибо.Мой алгоритм сортировки ответов не получил правильного ответа

#include<iostream> 
using namespace std; 
int merge(int a[], int low, int mid, int high) { 
    int h = low; int j = mid + 1; int k = low; 
    int *b = new int[high - low + 1]; 
    while ((h <= mid) && (j <= high)) { 
     if (a[h] < a[j]) 
      b[k++] = a[h++]; 
     else 
      b[k++] = a[j++]; 

    } 
    if (h > mid) { 
     for (j; j <= high;++j) 
      b[k++]=a[j]; 
    } 
    if (j > high) { 
     for (h; h <= mid; ++h) 
      b[k++] = a[h]; 
    } 
    for (int i = low; i <= high; ++i) 
     a[i] = b[i]; 
    delete []b; 
    return 0; 
} 
int MergeSort(int a[], int low, int high) { 
    if (low < high) { 
     int mid = (low + high)/2; 
     MergeSort(a, low, mid); 
     MergeSort(a, mid + 1, high); 
     merge(a, low, mid, high); 
    } 
    return 0; 
} 

int main() { 
    int const n(5); 
    int a[n]; 
    cout << "Input " << n << " numbers please:"; 
    for (int i = 0; i < n; ++i) { 
     cin >> a[i]; 
    } 
    MergeSort(a, 0, n - 1); 
    for (int i = 0; i <= n - 1; ++i) 
     cout << a[i] << " "; 
    cout << endl; 
} 
+0

Вы пытались отладить свой код? – HazemGomaa

+1

@Amier вы могли бы сказать, какой ввод дает вам неправильный ответ? код, похоже, отлично работает на моей системе ..! –

+1

Просто потому, что какой-то код проходит через компилятор без ошибок, это не значит, что он должен быть правильным. Существует много возможностей для * неопределенного поведения * или других * логических ошибок *. Прежде всего, вы должны включить дополнительные предупреждения и исправить их так, как если бы они были ошибками. Затем вы должны узнать, как использовать отладчик и как проходить код за строкой, контролируя переменные. –

ответ

1

MergeSort функция - предположим low + 1 == high таким mid==low.

Рекурсивный вызов с MergeSort(a, low, mid) вернется немедленно, в то время как MergeSort(a, mid, high) будет проходить снова тот же low и high - пока приложение не будет переполнение стека


(и вы будете размещать снова вопрос о SO?)

merge функция, предположительно low==3, mid==4, high==5.

Вы размещаете b[] от 3. Все идет нормально.

Но тогда вы начинаете с k=low (который является 3) и выполнить назначение b[k++] - уже вне границ еще на следующих этапах, когда вы будете писать на b[4] и b[5] (в то время как b[0] и b[1] останутся нетронутыми).

И так далее (в том числе for (int i = low; i <= high; ++i) a[i]=b[i];)

То, что вы, вероятно, хотите сделать, это выполнить все задания для хранения темпа с - low смещения (b[k-low] с последующим k++ в конце while цикла).

0

Я нашел лишь незначительную проблему. Попробуйте это простое исправление.

for (int i = 0; i <= n - 1; ++i) { 
     cout << a[i] << " "; 
     cout << endl; 
    } 

В вашем коде отсутствовали скобки в инструкции for. Этот код работает на моем компьютере с этим исправлением.

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