Einfügungssortierung (direkte Einfügungssortierung)

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.

direkte Einfügungssortierung

Die direkte Einfügungssortierung ist eine einfache Einfügungssortierungsmethode. Die Grundidee ist:
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 in eingefügt sind und Sie eine neue Reihenfolge erhalten Sequenz . Tatsächlich ist dies ähnlich wie beim Pokern. Die Karten, die wir bereits erhalten haben, wurden sortiert. Wenn wir eine andere Karte aufnehmen, müssen wir sie einzeln vergleichen und sie in der entsprechenden Reihenfolge an der entsprechenden Position einfügen.
Wie genau erfolgt die direkte Einfügungssortierung?
Beim Einfügen des i(i>=1) -Elements wird das vorherige Array[ 0] ,array[1],…,array[i-1] wurde sortiert, verwenden Sie jetzt array[i] Der Sortiercode von wird mit der Sortiercodesequenz von array[i-1], array[i-2],... verglichen, um die Einfügeposition zu finden. array[i]< / a> wird eingefügt und die Elemente an der ursprünglichen Position werden der Reihe nach nach hinten verschoben.

erreichen

Lassen Sie es uns Schritt für Schritt umsetzen
Geben Sie zunächst alle Zahlen in das Array a ein. Wir definieren eine Endposition, was bedeutet, dass die Endposition die letzte Position ist, die fotografiert und sequenziert wurde. Wenn Ende = 0, bedeutet dies, dass eine Zahl eingefügt wurde, weil Es gibt nur diese A-Zahl, daher muss sie in Ordnung sein. Definieren Sie einen tmp, der die als nächstes einzufügende Zahl darstellt, d. h. tmp=a[end+1];
#include<stdio.h>
void InsertSort(int* a, int n)//直接插入排序
{
  int i=0;
  int end=i;
  int tmp=a[end+1];
  
}

Als nächstes müssen wir Daten einfügen, das heißt, wir müssen a[end] und tmp vergleichen, welches kleiner ist und welches kleiner ist, wird zuerst platziert (vorausgesetzt, wir sortieren in aufsteigender Reihenfolge). Wer ist in der vorherigen Position größer und wer kleiner?

Wenn a[end]>tmp, dann bewegt sich tmp vorwärts und a[end] bewegt sich um eine Position nach hinten; das heißt, a[end+1]=a[end]; zu diesem Zeitpunkt kann a[ nicht direkt sein verschobenes Ende]=tmp, zu diesem Zeitpunkt Ende--, vergleiche weiterhin, wer größer und wer kleiner ist, mit der vorherigen Position


  if(a[end]>tmp)
  {
     a[end+1]=a[end];
     end--;
  }

Als nächstes nehmen wir den else-Fall an, d. h. a[end]<=tmp, tmp ist bereits größer als die letzte Position der genommenen Sequenz und muss größer als alle Zahlen in dieser Sequenz sein. Zu diesem Zeitpunkt müssen wir tmp nur der Position end+1 zuweisen, aber wir müssen diese Anweisung hier nicht hinzufügen. Wir verwenden break direkt, um aus else herauszuspringen, und warten darauf, dass tmp die if-Bedingung erfüllt und noch einmal und spielen Sie ein letztes Mal mit else. Fügen Sie diese Anweisung am Ende hinzu. Wenn a[end]>tmp end-- immer wieder zulässt und end=0 angibt, ist a[end] immer noch größer als tmp, end--=-1, was beweist, dass tmp der kleinste ist. Dann können Sie nach der while-Schleife a[end+1]=tmp hinzufügen. Sei new a[0]=tmp.

while (end >= 0)
{
	if (a[end] > tmp)
	{
		a[end + 1] = a[end];
		end--;
	}
	else
	{
		break;
	}

}
a[end + 1] = tmp;

Wenn wir hier ankommen, haben wir mit dem Einfügen einer Zahl fertig, und es müssen noch n-2 Zahlen eingefügt werden (da die erste Zahl automatisch sortiert wird und nicht eingefügt werden muss und normalerweise ab der zweiten Zahl eingefügt wird). Also haben wir eine weitere Schicht Schlaufe nach außen gelegt

for(i=0;i<n-1;i++)
{
   ....
}

Warum ist i<n-1? Denn i beginnt bei 0 und wir beginnen mit dem Einfügen von Daten ab a[1].

prüfen

#include<stdio.h>
int main()
{
	
	int a[] = { 6,1,2,7,9,3,4,5,10,8 };
	int n = sizeof(a) / sizeof(a[0]);
	InsertSort(a, n);
	for (int i = 0; i < n; i++)
	{
		printf("%d ", a[i]);
	}
	return 0;
}

Diese Sortierung ist hier abgeschlossen.

Zeitkomplexität

Wie hoch ist die zeitliche Komplexität dieser Sortierung? Um eine Zahl einzufügen, wie oft muss sie im schlimmsten Fall verschoben werden? Sie muss von der Endposition +1 zur Position 0 verschoben werden. Insgesamt müssen n-1 Zahlen eingefügt werden, also die Zeitkomplexität der Direkteinfügungssortierung ist O(N^2) .

Quellcode


void InsertSort(int* a, int n)//直接插入排序
{
	for (int i = 0; i < n-1; i++)
	{
		int end = i;
		int tmp = a[end+1];
		while (end >= 0)
		{
			if (a[end] > tmp)
			{
				a[end + 1] = a[end];
				end--;
			}
			else
			{
				break;
			}

		}
		a[end + 1] = tmp;
	}
}

Supongo que te gusta

Origin blog.csdn.net/weixin_67131528/article/details/135042270
Recomendado
Clasificación