2016-05-27 14 views
-3

Mein Programm muss ein Array in einem anderen Array sortieren. Wenn ich das Programm starte, druckt es 1 2 3 -858993460 5 -858993460 7. Ich kann nicht verstehen, wo der Fehler im Code ist.Ein Array in ein anderes Array sortieren C++

#include <iostream> 
using namespace std; 

int main() 
{ 
    const int N = 7; 
    int arr[N] = { 3, 17, 2, 9, 1, 5, 7 }; 

    int max = arr[0]; 
    for (int i = 1; i < N; i++) 
    { 
     if (max < arr[i]) 
      max = arr[i]; 
    } 
    int sort_arr[N]; 
    for (int j = 0; j < N; j++) 
    { 
     sort_arr[arr[j] - 1] = arr[j]; 
    } 

    for (int i = 0; i < N; i++) 
    { 
     cout << sort_arr[i] << " "; 
    } 

    return 0; 
} 
+2

Was genau versuchen Sie mit dieser Zeile zu tun: 'sort_arr [arr [j] - 1] = arr [j];'? – user2296177

+0

Wenn 'J' 1 ist, wird der Ausdruck' arr [j] - 1' zu '17-1' ausgewertet, was außerhalb des Bereichs für das Array' arr' ist. –

+0

'sort_arr [arr [j] - 1]' geht aus der Grenze des Arrays. (wenn 'j'' 1' ist, dann 'arr [j]' ist '17' und' arr [j] - 1' ist '16' ... Und wo hast du das Array sortiert? – songyuanyao

Antwort

0

Es scheint, dass Sie denken, dass sort_arr[arr[j] - 1] = arr[j]arr in sort_arr sortieren wird. Es wird nicht.

Sortierung ist bereits für Sie hier geschrieben: http://en.cppreference.com/w/cpp/algorithm/sort Sie, dass wie diese verwenden:

copy(cbegin(arr), cend(arr), begin(sort_arr)); 
sort(begin(sort_arr), end(sort_arr)); 

Live Example

0

Wenn Sie ein Array in ein anderes Array sortieren möchten dann eine Möglichkeit, eine Kopie erstellt wird des Arrays und verwenden Sie dann die Sortierfunktion in der Standardbibliothek, um das zweite Array zu sortieren.

int arr[10]; 
int b[10]; 
for(int i=0;i<10;i++) 
{ 
    cin>>arr[i]; 
    b[i]=arr[i]; 
} 
sort(b,b+10); 

// diese Sortierfunktion wird die Array-Elemente in aufsteigender Reihenfolge sortieren, und wenn Sie die Reihenfolge ändern wollen, dann nur eine Vergleichsfunktion als drittes Argument in die Sortierfunktion hinzuzufügen.

0

Okay, stellen Sie sich den Problemen in Ihrem Code.

Die "seltsamen" Zahlen, die Sie dort sehen, stammen aus dem nicht initialisierten Array sort_arr. Was meine ich mit nicht initialisiert? Nun, sort_arr ist ein kleines chunck irgendwo in deiner Erinnerung. Da ein Programm normalerweise seinen Speicher nicht löscht und stattdessen den Speicher beansprucht, den es als frei verwendet hat, kann der Teil von sort_arr Bits und Bytes enthalten, die von einem anderen Programm gesetzt wurden. Die Zahlen treten auf, da diese Bytes als ganzzahliger Wert interpretiert werden. Das erste, was zu tun wäre, wäre das Array vor der Verwendung zu initialisieren.

sort_arr[N] = { 0, 0, 0, 0, 0, 0, 0 }; 

Nun, warum sind diese Zahlen aufgetreten? Nun, Sie erwarten wahrscheinlich, dass Ihr Algorithmus alle Werte in sort_arr setzt, was zu einem sortierten Array führen würde, oder? Nun, aber Ihr Algorithmus funktioniert nicht so gut. Sehen Sie diese Zeile:

sort_arr[arr[j] - 1] = arr[j]; 

Was passiert, wenn j 1 ist? arr[1] wird dann zu 17 und 17 bewertet - 1 ist gleich 16. Also ist sort_arr[arr[1] - 1] dasselbe wie sort_arr[16], das die Grenzen Ihres Arrays überschreitet.

Wenn Sie einen Sortieralgorithmus selbst programmieren möchten, empfehle ich, mit einem einfachen bubble sort Algorithmus zu beginnen. Andernfalls, wenn Sie nur das Array sortieren müssen, schauen Sie sich den Header algorithm an. Es ist ziemlich einfach zu bedienen:

#include <iostream> 
#include <algorithm> 
#include <iterator> // << include this to use begin() and end() 

using namespace std; 

int main() 
{ 
    const int N = 7; 
    int arr[N] = { 3, 17, 2, 9, 1, 5, 7 }; 

    int sort_arr[N] = { 0, 0, 0, 0, 0, 0, 0 }; 

    copy(begin(arr), end(arr), begin(sort_arr)); 
    sort(begin(sort_arr), end(sort_arr)); 

    for (int i = 0; i < N; i++) 
    { 
     cout << sort_arr[i] << " "; 
    } 
    cout << endl; 
} 

Übrigens. Sie suchen nach dem größten Wert in Ihrem Array, oder? Nachdem Sie das Array sortiert haben, ist sort_arr[N - 1] der größte Wert in Ihrem Array.

0

Meine Vermutung ist, dass dies ein Versuch ist, eine Art von Zählsortierung zu implementieren. Beachten Sie, dass Arrays mit variabler Länge in C++ oder einigen Versionen von C normalerweise nicht erlaubt sind. Sie könnten _alloca() verwenden, um den Stapel so abzusetzen, dass er das Äquivalent eines Array variabler Länge erhält: int * sort_arr = (int *) _ allo (max * sizeof (int)); .

#include <iostream> 
using namespace std; 

int main() 
{ 
    const int N = 7; 
    // assuming range of values is 1 to ... 
    int arr[N] = { 3, 17, 2, 9, 1, 5, 7 }; 

    int max = arr[0]; 
    for (int i = 1; i < N; i++) 
    { 
     if (max < arr[i]) 
      max = arr[i]; 
    } 
    int sort_arr[max]; 
    for (int i = 0; i < max; i++) 
    { 
     sort_arr[i] = 0; 
    } 
    for (int j = 0; j < N; j++) 
    { 
     sort_arr[arr[j] - 1]++; 
    } 

    for (int i = 0; i < max; i++) 
    { 
     while(sort_arr[i]) 
     { 
      cout << i+1 << " "; 
      sort_arr[i]--; 
     } 
    } 

    return 0; 
}