Ein Array nach Index sortieren: Das Geheimnis mit C++ entschlüsseln

Das Sortieren von Arrays ist eine grundlegende Aufgabe in der Programmierung, aber was, wenn Sie nur die Indizes der sortierten Werte anstelle der sortierten Werte selbst benötigen? Dieses häufige Problem hat das Interesse vieler Entwickler geweckt, insbesondere derjenigen, die C oder C++ verwenden. In diesem Beitrag zeigen wir, wie man ein Array nach Wert sortiert und dabei die Indizes der Elemente in sortierter Reihenfolge zurückgibt.

Die Herausforderung

Stellen Sie sich vor, Sie haben ein Array von Ganzzahlen, und Ihr Ziel ist es, es in aufsteigender Reihenfolge zu sortieren. Statt die sortierten Zahlen selbst zurückzugeben, möchten Sie ein Array, das die ursprünglichen Indizes dieser sortierten Zahlen angibt. Zum Beispiel, gegeben das Eingangsarray:

Eingabe:  1, 3, 4, 9, 6

Die Ausgabe sollte die Indizes der sortierten Werte widerspiegeln:

Ausgabe: 1, 2, 3, 5, 4

Ein Twist beim Sortieren

Sie verwenden wahrscheinlich einen Sortieralgorithmus wie das in der Anfrage erwähnte Shell-Sort-Verfahren. Allerdings können bestimmte Implementierungen in der Programmierung zu Fehlern führen, insbesondere beim Umgang mit Zeigern. Dieser Beitrag zielt darauf ab, zu verdeutlichen, wie man mit Arrays in C/C++ umgeht und eine Sortierfunktion erstellt, die die angegebenen Anforderungen erfüllt.

Schritt 1: Erstellen Sie ein Array von Zeigern

Um das Sortieren zu erleichtern, ohne die Positionsinformationen zu verlieren, können wir ein Array von Zeigern erstellen, das auf die Elemente des ursprünglichen Arrays zeigt. Auf diese Weise sortieren wir indirekt die Werte des ursprünglichen Arrays, während wir die Indexzuordnung beibehalten. So können Sie es machen:

int* intArray; // Wird mit Ihren Ganzzahlen initialisiert.
int arrayLen;  // Länge des Ganzzahl-Arrays.

int** pintArray = new int*[arrayLen]; // Ein Array von Zeigern erstellen.
for(int i = 0; i < arrayLen; ++i)
{
    pintArray[i] = &intArray[i]; // Auf die jeweiligen Elemente verweisen.
}

Schritt 2: Sortieren Sie das Array von Zeigern

Sobald Sie die Zeiger bereit haben, können Sie jeden Sortieralgorithmus (wie z.B. Shell Sort) anwenden, um die Zeiger basierend auf den Werten zu sortieren, auf die sie zeigen. Hier ist eine einfache Demonstration:

SortIntPointers(pintArray, arrayLen); // Sortiert das Zeiger-Array basierend auf den Werten.

Schritt 3: Weisen Sie die sortierten Indizes zu

Nachdem Sie die Zeiger sortiert haben, können Sie durch sie hindurchgehen und ihre entsprechenden sortierten Positionen zurück zum ursprünglichen Zeiger-Array zuweisen. Dadurch stellen Sie sicher, dass Sie die entsprechenden Indizes erhalten.

for(int i = 0; i < arrayLen; ++i)
{
    *pintArray[i] = i; // Weisen Sie die sortierten Indexpositionen zu.
}

Vollständiges Implementierungsbeispiel

Um alles zusammenzufassen, hier ist ein vollständiges Beispiel, das den oben skizzierten Schritten folgt:

void SortIntPointers(int** pArray, int ArrayLength) {
    int flag = 1;    
    int* temp;    
    
    for (int i = 1; (i <= ArrayLength) && flag; i++)
    {
        flag = 0;
        for (int j = 0; j < ArrayLength - 1; j++)
        {
            if (*pArray[j + 1] < *pArray[j]) // Wechseln zu aufsteigender Reihenfolge
            { 
                temp = pArray[j]; // Elemente tauschen
                pArray[j] = pArray[j + 1];
                pArray[j + 1] = temp;
                flag = 1; // Ein Tausch hat stattgefunden.
            }
        }
    }
}

// Initialisieren und sortieren Sie Ihre Zeiger, wie oben demonstriert.

Fazit

Arrays nach Index zu sortieren, ohne ihre ursprünglichen Positionen aus den Augen zu verlieren, kann knifflig sein, insbesondere bei Zeigern in C/C++. Durch das Erstellen eines Arrays von Zeigern und das Sortieren dieses Arrays können Sie diese Herausforderung effektiv meistern. Denken Sie daran, Fehlerbehandlung zu implementieren und Randfälle für robusteren Code zu berücksichtigen. Viel Spaß beim Programmieren!