[Algorithmus] Sortierung – Einfügungssortierung und Hügelsortierung

Inhaltsverzeichnis

Vorwort

1. Das Konzept des Sortierens und seine Anwendung

1.1 Sortierkonzept

1.2 Anwendung der Sortierung

1.3 Gängige Sortieralgorithmen

2. Implementierung der Einfügungssortierung 

Optimierung basierend auf Einfügungssortierung – Hill-Sortierung (schrumpfende inkrementelle Sortierung)


 

 =============================================== =======================

Startseite

Code-Repository

C-Sprachspalte

Elementare Datenstrukturspalte

Linux-Kolumne

Fragen zum LeetCode-Pinsel 

Spalte „Algorithmus“. 

=============================================== =======================

Vorwort

Dies ist eine neue Algorithmen-Kolumne. Wie wir alle wissen, sind Algorithmen relativ schwierig und sehr gehirnintensiv. In den vorherigen Ausgaben haben wir einige einfache Sortieralgorithmen vorgestellt, damit sich jeder daran gewöhnen kann. Heute, in der ersten Ausgabe, haben wir bringt Ihnen Einfügungssortierung und optimierte Hügelsortierung für Einfügungssortierung.


1. Das Konzept des Sortierens und seine Anwendung

Sortieren ist überall im Leben zu sehen, beispielsweise bei Noten, Unternehmensrankings, Universitätsrankings und Ladenrankings in mancher Lebensmittelsoftware usw. Sie alle sortieren, also was ist Sortieren? Wie implementiert man die Sortierung? Bitte hör mir aufmerksam zu,

1.1 Sortierkonzept

Sortieren: Beim sogenannten Sortieren wird eine Reihe von Datensätzen in aufsteigender oder absteigender Reihenfolge entsprechend der Größe eines oder mehrerer darin enthaltener Schlüsselwörter angeordnet.
Stabilität: Angenommen, in der zu sortierenden Datensatzsequenz gibt es mehrere Datensätze mit demselben Schlüsselwort. Bei der Sortierung bleibt die relative Reihenfolge dieser Datensätze unverändert, d. h. in der ursprünglichen Sequenz gilt r[i]=r[j] , und r[i] vor r[j] liegt und in der sortierten Sequenz r[i] noch vor r[j] liegt, dann heißt dieser Sortieralgorithmus stabil, andernfalls heißt er instabil.
Interne Sortierung: Sortierung, bei der alle Datenelemente im Speicher abgelegt werden.
Externe Sortierung: Es gibt zu viele Datenelemente, die nicht gleichzeitig im Speicher abgelegt werden können. Entsprechend den Anforderungen des Sortierprozesses können die Daten nicht zwischen internem und externem Speicher verschoben werden.

1.2 Anwendung der Sortierung

 

1.3 Gängige Sortieralgorithmen

 


2. Implementierung der Einfügungssortierung 

Grundidee: Fügen Sie die zu sortierenden Datensätze nacheinander entsprechend der Größe ihrer Schlüsselwerte in eine bereits sortierte Reihenfolge ein, bis alle Datensätze eingefügt sind und eine neue Reihenfolge erhalten wird.

Einfügungssorte im Leben

Freunde, die Kartenspiele mögen, müssen mit Poker und Mahjong vertraut sein! Wenn wir die Karten organisieren, verwenden wir die Einfügungssortierung

Beim Einfügen des Elements i (i>=1) wurden die vorherigen Arrays [0], Array [1], ..., Array [i-1] sortiert. Verwenden Sie zu diesem Zeitpunkt den Sortiercode von Array [i ] und Die Sortiercodereihenfolge von Array[i-1], Array[i-2],... wird verglichen. Wenn die Einfügeposition gefunden ist, wird Array[i] eingefügt und die Reihenfolge der Elemente am Original Position wird nach hinten verschoben.

Einfach ausgedrückt : Die letzten gültigen Daten im Array sind die Daten, die wir einfügen möchten. Sie werden der Reihe nach mit den zuvor sortierten Daten verglichen und schließlich an der entsprechenden Position platziert.

Zusammenfassung der Merkmale der Direkteinfügungssortierung:
1. Je näher die Elementmenge an der Ordnung liegt, desto höher ist die Zeiteffizienz des Direkteinfügungssortierungsalgorithmus.
2. Zeitkomplexität: O(N^2)
3. Raumkomplexität: O(1 ) , ein stabiler Sortieralgorithmus
4. Stabilität: Stabil 

Code implementieren

void InsertSort(int* a, int n)
{
	//[0,end]有序,把end+1位置的插入到前序序列
    //控制[0,end+1]有序
	for (int i = 0; i < n - 1; i++)
	{
		int end = i;
		int tmp = a[end + 1];
		while (end >= 0)
		{
			if (tmp < a[end])
			{
				a[end + 1] = a[end];
			}
			else
			{
				break;
			}
			end--;
		}
		a[end + 1] = tmp;
	}
}

Optimierung basierend auf Einfügungssortierung – Hill-Sortierung (schrumpfende inkrementelle Sortierung)

Die Hill-Sortiermethode wird auch als Shrinking-Inkrement-Methode bezeichnet . Die Grundidee der Hill-Sortiermethodebesteht darin, zunächst eine Ganzzahl auszuwählen, alle Datensätze in der zu sortierenden Datei in Gruppen aufzuteilen, alle Datensätze mit Abstand in dieselbe Gruppe einzufügen und die Datensätze in jeder Gruppe zu sortieren. Nehmen Sie dann die oben beschriebene Gruppierungs- und Sortierarbeit vor und wiederholen Sie sie. Wenn =1 erreicht ist, werden alle Datensätze in derselben Gruppe sortiert.

Stufen der Hügelart:

1. Wählen Sie eine Ganzzahl aus, die kleiner als die Länge des zu gruppierenden Arrays (bezeichnet als: Lücke) ist, und verwenden Sie dann die Einfügungssortierung, um jede Gruppe vorzusortieren.

2. Mit fortschreitendem Programm verringert sich die Lücke allmählich. Wenn die Lücke gleich 1 ist, handelt es sich um eine Einfügungssortierung.

Code implementieren

while (gap > 1)
	{
		gap = gap / 2;
		for (int i = 0; i < n - gap; i++)
		{
			int end = i;
			int tmp = a[end + gap];
			while (end >= 0)
			{
				if (tmp < a[end])
				{
					a[end + gap] = a[end];
					end = end - gap;
				}
				else

				{
					break;
				}
				a[end + gap] = tmp;
			}
		}
	}

 Zusammenfassung der Merkmale der Hill-Sortierung:
1. Die Hill-Sortierung ist eine Optimierung der Direkteinfügungssortierung.
2. Wenn die Lücke > 1 ist, wird vorsortiert, um das Array näher an die Ordnung zu bringen. Wenn Gap == 1 ist, ist das Array bereits fast geordnet und daher schnell. Auf diese Weise können insgesamt Optimierungsergebnisse erzielt werden. Nachdem wir es implementiert haben, können wir die Leistungstests vergleichen.
3. Die zeitliche Komplexität der Hill-Sortierung ist schwer zu berechnen, da es viele Möglichkeiten gibt, Lücken zu bewerten, was die Berechnung erschwert. Daher ist die in vielen Bäumen angegebene zeitliche Komplexität der Hill-Sortierung nicht festgelegt:

 „Datenstruktur (C-Sprachversion)“ --- Yan Weimin

„Datenstruktur – Beschreibung mit objektorientierten Methoden und C++“ --- Yin Renkun

 Da unsere Lücke nach der von Knuth vorgeschlagenen Methode berechnet wird und Knuth eine große Anzahl experimenteller Statistiken durchgeführt hat, werden wir sie vorübergehend wie folgt berechnen: O (n ^ 1,25) bis O (1,6 * n ^ 1,25).

Die Bedeutung der Hill-Sortierung:  Große Zahlen gehen schneller nach hinten und kleine Zahlen gehen schneller nach vorne. Je größer die Lücke, desto schneller der Sprung. Je kleiner die Lücke, desto näher liegt sie an der Einfügungssortierung. Wenn Lücke == 1, handelt es sich um eine Einfügungssortierung.

Das war's mit der heutigen Einfügungssortierung. Die Auswahlsortierung werde ich Ihnen in der nächsten Ausgabe vorstellen, also bleiben Sie dran! ! !

Acho que você gosta

Origin blog.csdn.net/qq_55119554/article/details/133254740
Recomendado
Clasificación