2015-02-21 2 views
0

Я пытаюсь упорядочить слияние сортировки по рекурсии. Однако я не получаю вывод в надлежащем порядке сортировки. Пожалуйста, исправьте мой код и расскажите мне о моей ошибке. Программа принимает количество элементов и элементов от пользователя. На основе данных программа shoud предоставляет элементы в отсортированном порядке. Код выглядит следующим образом.Проблема с выдачей слияния сортировки

#include <iostream> 
#include <cstdio> 
#define max 20 

using namespace std; 

int data[max]; 
int nw[max]; 
void mergeparts(int, int, int); 


void merge_sort(int low, int high){ 
    int mid; 

    if(low<high){ 
     mid=(low+high)/2; 
     merge_sort(low, mid); 
     merge_sort(mid+1, high); 
     mergeparts(low, mid, high); 
    } 
} 

void mergeparts(int low, int mid, int high){ 

    for(int i=low; i<high; i++){ 
     nw[i] = data[i]; 
    } 
    int i = low; 
    int j = mid+1; 
    int k = low; 


    while((i <= mid)&&(j <= high)){ 
     if(nw[i]<=nw[j]){ 
      data[k]=nw[i]; 
      i++; 
     } 
     else{ 
      data[k]=nw[j]; 
      j++; 
     } 
     k++; 
    } 

    while(i <= mid){ 
     data[k] = nw[i]; 
     k++; 
     i++; 
    } 

    while(j <= high){ 
     data[k] = nw[j]; 
     k++; 
     j++; 
    } 
    for(int i=low; i<high; i++){ 
     data[i] = nw[i]; 
    } 

} 

int main(){ 
    int n; 

    cout<<"Enter the number of elements"<<endl; 
    cin>>n; 



    cout<<"Enter the "<<n<<" numbers."<<endl; 
    for(int i=0; i<n; i++){ 
     cin>>data[i]; 
    } 

    cout<<"The unsorted list is: "<<endl; 
    for(int i=0; i<n; i++){ 
     printf("%d\t",data[i]); 
    } 
    cout<<endl; 

    merge_sort(0,n+1); 

    cout<<"The sorted list is: "<<endl; 
     for(int i=0; i<n; i++){ 
      printf("%d\t",data[i]); 
    } 
    return 0; 
} 
+0

Множество опрокидывающих бомбардиров сегодня утром, не принимайте это лично. Но это довольно много кода для чтения, без описания того, что он делает, без комментариев. Кроме того, вы должны, по крайней мере, иметь пример ввода/вывода с ожидаемым результатом. – BoBTFish

+0

Вам следует попробовать немного сложнее (я усвоил здесь трудный путь). Взгляните на это: http://geeksquiz.com/merge-sort/. Это решение C, но оно также будет работать на C++. Кроме того, зачем смешивать printf и cout? – Transcendental

+0

@Transcendental: мой код в точности похож на ссылку, о которой вы упоминали, только то, что входные данные являются статичными, и я хочу, чтобы она была динамичной. Я хотел проверить, работает ли printf и cout одновременно в программе cpp или нет – Android7

ответ

1

Ваш код не совпадает с одной из this статьи, как вы написали в своем комментарии. Основное различие заключается в функции слияния.

Если вы внимательно изучите свой код, вы заметите, что есть части вашего кода, которые могут изменить массив данных, не сохраняя его текущее состояние; например:

while(i <= mid){ 
     data[k] = nw[i]; 
     k++; 
     i++; 
    } 

Попробуйте использовать массив из 4 элементов, например. 5,6,4,2, и вы заметите, что некоторые из исходных элементов массива не будут отображаться в выходном массиве.

Вы не указали информацию о своей развивающейся среде, но в большинстве из них встроены отладчики. Играйте с отладчиком, и в конечном итоге вы решите свою проблему. Или перечитайте статью и снова запишите алгоритм.

Удачи.

(Кроме того, в будущем попробуйте быть более конкретным с вопросом заголовка и попробуйте предоставить дополнительную информацию о проблеме, например, некоторые примеры. Люди здесь хотят помочь, но не у каждого есть достаточно времени для чтения вопрос, компиляция или отладка вашего кода.Если вы более конкретны, кто-то может знать ответ, просто прочитав ваш вопрос и не получив дальнейшего расследования)

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