2016-11-23 2 views
1

Ich versuche, ein C++ - Programm zu schreiben, das ein Benutzereingabearray mit dem Merge-Algorithmus sortiert.Merge Sort-Algorithmus in C++

Hier ist die Split-Funktion:

void split(int numbers[], int size) { 
    if (size == 1) 
     return; 

    int mid = size/2; 
    int firstPartSize = mid; 
    int secondPartSize = size - mid; 

    int *firstArray; 
    firstArray = new int[firstPartSize]; 

    int *secondArray; 
    secondArray = new int[secondPartSize]; 

    for (int i = 0; i < size; i++) { 
     if (i < mid) 
      firstArray[i] = numbers[i]; 
     else 
      secondArray[i - mid] = numbers[i]; 
    } 

    split(firstArray, firstPartSize); 
    split(secondArray, secondPartSize); 
    merge(numbers, firstArray, firstPartSize, secondArray, secondPartSize); 
} 

Hier ist die Vereinigungsfunktion:

void merge(int outputArray[], int firstArray[], int n1, int secondArray[], int n2) { 
    int k = 0; 
    int i = 0; 
    int j = 0; 
    while (i < n1 && j < n2) { 
     if (firstArray[i] < secondArray[j]) 
      outputArray[k++] = firstArray[i++]; 
     else 
      outputArray[k++] = secondArray[j++]; 
    } 

    while (i < n1) 
     outputArray[k++] = firstArray[i++]; 
    while (j < n2) 
     outputArray[k++] = secondArray[j++]; 

    for (int c = 0; c < n1+n2; c++) 
    { 
     cout << outputArray[c] << " "; 
    } 
} 

Wenn ich versuche, ein Array einfügen, hier ist was ich

Enter the size of the array you want to sort: 
3 
Enter the elements of the array: 
4 
7 
1 
1 7 1 4 7 Press any key to continue 

bekommen Was bin ich hier fehlt?

+2

Willkommen bei Stack-Überlauf! Es klingt, als müssten Sie lernen, wie Sie einen Debugger verwenden, um durch Ihren Code zu gehen. Mit einem guten Debugger können Sie Ihr Programm Zeile für Zeile ausführen und sehen, wo es von dem, was Sie erwarten, abweicht. Dies ist ein essentielles Werkzeug, wenn Sie programmieren wollen. Weiterführende Literatur: [Wie kleine Programme zu debuggen] (https://ericlippert.com/2014/03/05/how-to-debug-small-programs/). –

+1

Das richtige Werkzeug, um solche Probleme zu lösen, ist Ihr Debugger. Sie sollten Schritt für Schritt durch Ihren Code * gehen, bevor Sie auf Stack Overflow nachfragen. Für weitere Hilfe lesen Sie bitte [Wie kleine Programme zu debuggen (von Eric Lippert)] (https://ericlippert.com/2014/03/05/how-to-debug-small-programs/). Zumindest sollten Sie Ihre Frage bearbeiten, um ein [minimales, vollständiges und verifizierbares] (http://stackoverflow.com/help/mcve) Beispiel einzufügen, das Ihr Problem zusammen mit den Beobachtungen, die Sie in der Debugger. –

+3

[sizeof] (http://en.cppreference.com/w/cpp/language/sizeof) tut nicht, was Sie denken, dass es tut. –

Antwort

0

Der Code ist insgesamt mit einem einfachen Fehler korrekt. Sie drucken die Ausgabe in einem der rekursiven Schritte und erhalten daher die Zwischenergebnisse mit der Antwort gemischt.

Entfernen der cout in der merge Funktion und es heraus zu einer main Funktion bewegt den Trick:

void merge(int outputArray[], int firstArray[], int n1, int secondArray[], int n2) { 
    int k = 0; 
    int i = 0; 
    int j = 0; 
    while (i < n1 && j < n2) { 
     if (firstArray[i] < secondArray[j]) 
      outputArray[k++] = firstArray[i++]; 
     else 
      outputArray[k++] = secondArray[j++]; 
    } 

    while (i < n1) 
     outputArray[k++] = firstArray[i++]; 
    while (j < n2) 
     outputArray[k++] = secondArray[j++]; 

} 

int main(int argc, char *argv[]) { 

    int a[] = {1, 4, 7}; 
    int n = sizeof(a)/sizeof(int); 
    split(a, n); 

    cout << "The array is:\n"; 
    for (int i = 0; i < n; i++) { 
     cout << a[i] << " "; 
    } 
    cout << endl; 

    return 0; 
} 

Ausgang:

The array is: 
1 4 7