2016-09-12 1 views
0

Я попытался сортировки с простого случаяMerge Сортировка не удается объединить части в конце процесса

test = {12, 11, 13, 5, 6}; 

Это делает spliting и слияние подразделов в lefthalf и righthalf как

{11 12} & {5 6 13} 

который хочет. Но в Final Слияния он принимает lefthalf и righthalf, как

{12 11} & {13 5 6} 

И это дает неправильный ответ:

{12 11 13 5 6} 

Почему это происходит? Вот мой код.

void mergesrt(deque<int> mydeq){ 
if (mydeq.size() > 1){ 
    int mid = mydeq.size()/2; 
    deque<int> lefthalf(mydeq.begin(), mydeq.begin() + mid); 
    deque<int> righthalf(mydeq.begin() + mid, mydeq.begin() + mydeq.size()); 
    mergesrt(lefthalf); 
    mergesrt(righthalf); 
    int i = 0; 
    int j = 0; 
    int k = 0; 
    cout << "--------------merging-----------" << endl; 

    while (i < lefthalf.size() && j < righthalf.size()){ 
    if (lefthalf[i] < righthalf[j]){ 
      mydeq[k] = lefthalf[i]; 
      k++; 
      i++; 
    } 
    else{ 
      mydeq[k] = righthalf[j]; 
      k++; 
      j++; 
      } 
      } 

    while (i < lefthalf.size()){ 
      mydeq[k] = lefthalf[i]; 
      k++; 
      i++; 
      } 

    while (j < lefthalf.size()){ 
      mydeq[k] = righthalf[j]; 
      k++; 
      j++; 
      } 
      } 

     return; 
     } 
+1

Похоже, вам, возможно, потребуется научиться использовать отладчик для перехода по вашему коду. С хорошим отладчиком вы можете выполнить свою программу по очереди и посмотреть, где она отклоняется от ожидаемого. Это важный инструмент, если вы собираетесь заниматься программированием. Дальнейшее чтение: ** [Как отлаживать небольшие программы] (http://ericlippert.com/2014/03/05/how-to-debug-small-programs/) ** – NathanOliver

+1

Я уверен, что он уже отлаживается обеспечить соответствующий промежуточный вход и выход @NathanOliver – prabodhprakash

+0

Найдите небольшой пример сбоя. Попробуйте алгоритм вручную с ручкой и бумагой. Если на бумаге ошибка не возникает, сравните шаги с отладчиком и узнайте, где компьютер делает что-то другое в ручном и бумажном исполнении. – MrSmith42

ответ

4

Проблема здесь тонкая и не легко замечаемая новыми разработчиками. Вы передаете свой аргумент mergsrt по значению, что означает, что копия сделана. Сортировка выполняется на этой копии, и исходный deque не изменяется. Вы должны пройти по ссылке (mergsrt(deque<int> &)).

+0

И это работало! Большое спасибо. –

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