Berechnen Sie die minimale Anzahl von Swaps, um eine Sequenz zu sortieren

8

zuvor habe ich an der Sortierung einer ganzzahligen Sequenz ohne identische Zahlen gearbeitet (ohne Verlust der Allgemeinheit, angenommen, die Sequenz ist eine Permutation von 1,2,...,n ) in ihre natürliche aufsteigende Reihenfolge (d. h. 1,2,...,n ). Ich denke darüber nach, wie man die Elemente (unabhängig von den Positionen der Elemente, dh ein Swap ist für zwei beliebige Elemente gültig) mit einer minimalen Anzahl von Swaps tauschen kann. Ich denke, das Folgende ist ein praktikabler Algorithmus:

  

Tausche zwei Elemente mit der Einschränkung, dass eine oder beide von ihnen in die richtige Position getauscht werden sollen. Bis jedes Element in der richtigen Position ist.

Aber ich weiß nicht, wie ich mathematisch beweisen kann, ob der obige Algorithmus zur optimalen Lösung führen kann. Jeder kann helfen?

Vielen Dank.

    
mintaka 01.03.2013, 07:00
quelle

4 Antworten

16

Ich konnte dies mit der Graphentheorie beweisen. Vielleicht möchte ich dieses Tag hinzufügen in:)

Erstellen Sie ein Diagramm mit n Vertices. Erstellen Sie eine Kante vom Knoten n_i bis n_j , wenn das Element in der Position i in der richtigen Reihenfolge in der Position j stehen sollte. Sie haben jetzt ein Diagramm, das aus mehreren sich nicht überschneidenden Zyklen besteht. Ich behaupte, dass die Mindestanzahl von Swaps, die benötigt werden, um das Diagramm korrekt zu ordnen,

ist %Vor%

Nimm dir eine Sekunde, um dich davon zu überzeugen ... wenn zwei Gegenstände in einem Zyklus sind, kann ein Tausch nur für sie sorgen. Wenn sich drei Elemente in einem Zyklus befinden, können Sie ein Paar austauschen, um eines an die richtige Stelle zu setzen, und ein Zweizyklus bleibt usw. Wenn n Elemente in einem Zyklus sind, benötigen Sie n-1 swaps. (Dies gilt immer, auch wenn Sie nicht mit unmittelbaren Nachbarn tauschen.)

Vorausgesetzt, dass Sie jetzt sehen können, warum Ihr Algorithmus optimal ist. Wenn Sie einen Swap durchführen und mindestens ein Element an der richtigen Position ist, wird der Wert von M immer um 1 reduziert. Für jeden Zyklus der Länge n sollten Sie ein Element an die richtige Position, belegt mit, versetzen sein Nachbar. Sie haben jetzt ein korrekt geordnetes Element und einen Zyklus der Länge n-1 .

Da M die minimale Anzahl von Swaps ist und Ihr Algorithmus M für jeden Swap immer um 1 reduziert, muss er optimal sein.

    
Andrew Mao 01.03.2013, 07:21
quelle
3

Zu Ihrer Information, hier ist ein Algorithmus, den ich geschrieben habe, um die minimale Anzahl von Swaps zu generieren, die benötigt werden, um das Array zu sortieren. Es findet die Zyklen wie von Andrew Mao beschrieben.

%Vor%     
bekce 09.11.2016 12:57
quelle
0

Schön gemacht Lösung von @bekce. Bei Verwendung von C # kann der Anfangscode zum Einrichten des modifizierten Arrays ar kurz und bündig wie folgt ausgedrückt werden:

%Vor%

Verwenden Sie dann origIndexes anstelle von ar im Rest des Codes.

    
Steve Faiwiszewski 22.11.2016 23:12
quelle
0

Dies ist der Beispielcode in C ++, der die minimale Anzahl von Swaps zum Sortieren einer Permutation der Sequenz von (1,2,3,4,5,.......n-2,n-1,n)

findet %Vor%     
Vinayak Sangar 05.01.2017 09:47
quelle