direkte Einfügungssortierung
erreichen
#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;
}
}