Fassen Sie den klassischen Sortieralgorithmus zusammen

Sortieralgorithmus

Als Einführung in den Algorithmus müssen Sie den Sortieralgorithmus beherrschen. Ich fange gerade an, den Algorithmus zu bürsten. Beginnen wir von hier aus mit der Beschreibung meines Algorithmusverlaufs.

冒泡排序

Komplexität O (n2)

  • Beschreibung des Algorithmus
    1. Die äußere Schleife 0-n bedeutet, dass n Elemente einmal abgeglichen werden sollen.
    2. Die innere j = n-1-jsoll ein Element abgleichen und die zu vergleichenden Elemente jedes Mal um eins reduzieren, dh nur das erste n-1-jvon vergleichen das unsortierte Sequenzelement .
    3. Bei jedem Vergleich werden benachbarte Elemente verglichen und die übereinstimmenden Elemente werden bis zum Ende "versenkt", sodass Sie sich darüber keine Sorgen machen müssen.
  • Dynamische Präsentation
    Fügen Sie hier eine Bildbeschreibung ein
  • Code
#include <iostream>
using namespace std;

void swap(int *a, int *b){
    
    
        int temp = *a;
        *a = *b;
        *b = temp;
}
int main(int argc, char** argv){
    
    

        int             len;
        cout << "please input arr lenth:";
        cin >> len;
        int arr[len];
        for(int i=0; i<len; i++){
    
    
                cout << "please input" << i << "num:";
                cin >> arr[i];
        }
		for(int i=0; i<len; i++){
    
    
                for(int j=0; j<len-i-1; j++){
    
    
                        if(arr[j] > arr[j+1]){
    
    
                                swap(&arr[j],&arr[j+1]);
                        }
                }
        }

        for(int i=0; i<len; i++){
    
    
                cout << arr[i] << " ";
        }
        cout << "\n";
        return 0;
}

快速排序

Die Komplexität der schnellen Sortierung von O (nlog2n) ist wie folgt.
Zunächst wird aus einem Datensatz wie "3 2 3 5 1 9 6" die schnelle Sortierung in die folgenden Schritte unterteilt.

  • 1. Suchen Sie eine Basisnummer, hier ist der erste arr [0] (dh 3).
  • 2. Ändern Sie zum Vergleich die Zahl größer als 3 links von 3 und die Zahl kleiner als 3 rechts von 3.
  • 3. Ändern Sie dann die Position des Werts zum Zeitpunkt der Begegnung mit der Referenznummer.
  • 4. Verwenden Sie dann die Rekursion, um die linke bzw. rechte Seite zu sortieren

Hinweis: Die rechte Seite muss hier zuerst verschoben werden, da die Referenznummer die linke Seite der Auswahl ist. Wenn die am weitesten links stehende Nummer arr [links] als Referenznummer ausgewählt ist, kann ausgehend von der rechten Seite sichergestellt werden, dass i und Wenn Sie sich treffen, ist die Anzahl der Begegnungen geringer. Für die Basiszahl ist die linke Seite der Position der Temperatur nach dem Austausch kleiner als die Temperatur. Aber von links beginnend ist die Anzahl der Begegnungen größer als die Referenznummer, und es kann nicht befriedigt werden, dass die Anzahl links von der Temperatur kleiner als diese ist. Beginnen Sie zum Scannen auf der gegenüberliegenden Seite der Referenznummer. beispielsweise:

初始数列:3 2 3 5 1 9 6
变换后数列:3 2 3 1 5 9 6(到这里只有15换了位置)
我们可以看到上面一步将15交换了位置,这时侯左边哨兵指向1,右边哨兵指向5,如果左边哨兵先走,
那么他就指向了5,然后停下来,右边哨兵也因为条件不满足停在了5这里,然后让35交换。这样逻辑就错误了,所以只能是右边先走。
  • Code
#include <iostream>
using namespace std;

//快速排序(从小到大)
void quickSort(int left, int right, int * arr)
{
    
    
        if(left >= right)
                return;
        int i, j, base, temp;
        i = left, j = right;
        base = arr[left];  //取最左边的数为基准数
        while (i < j)
        {
    
    
                while (arr[j] >= base && i < j)
                        j--;
                while (arr[i] <= base && i < j)
                        i++;
                if(i < j)
                {
    
    
                        temp = arr[i];
                        arr[i] = arr[j];
                        arr[j] = temp;
                }
        }
        //基准数归位
        arr[left] = arr[i];
        arr[i] = base;
        quickSort(left, i - 1, arr);//递归左边
        quickSort(i + 1, right, arr);//递归右边
}

int main(int argc, char** agrv){
    
    
        int             len;
        cout << "please input lenth:";
        cin >> len;
        int arr[len];
        for(int i=0; i<len; i++){
    
    
                cout << "please input num:";
                cin >> arr[i];
        }
        quickSort(0,len-1,arr);
        for(int i=0; i<len; i++){
    
    
                cout << arr[i] << " ";
        }
        cout << "\n";
        return 0;
}

插入排序

Die Komplexität der
Einfügungssortierung nach O (n2) besteht darin, sie mit der vorherigen zu vergleichen, beginnend mit der ersten, da die nullte bereits als geordnetes Array behandelt wird. Beginnen Sie dann mit dem ersten und vergleichen Sie mit der Vorderseite und bewegen Sie sich dann rückwärts.
Nehmen Sie als Beispiel [1, 5, 4, 3, 4, 5, 6, 8]:
key = arr [i]
Fügen Sie hier eine Bildbeschreibung ein
Zuerst wird festgestellt, dass j in einer guten Reihenfolge ist, und dann von i aus begonnen, um es mit dem vorherigen zu vergleichen Eins, i> j Daher bleibt 5 unverändert.
Fügen Sie hier eine Bildbeschreibung ein
Die zweite Runde ist hier und dann 5> 4, also ist die durchgeführte Operation arr [j + 1] = arr [j], dh 5 wird auf 4 verschoben und dann wird 4 mit der vorherigen 1 verglichen.
Fügen Sie hier eine Bildbeschreibung ein
Dann ist es so, dann vergleiche 1 mit 4, 1 <4, also keine Operation.
Fügen Sie hier eine Bildbeschreibung ein
Dann zeigen i und j auf 3 bzw. 5.
Fügen Sie hier eine Bildbeschreibung ein
Für den ersten Vergleich 5> 3, also wird 5 zurück verschoben

 while(j>=0 && arr[j]> key){
    
    
                        arr[j+1] = arr[j];
                        j--;
                }

Fügen Sie hier eine Bildbeschreibung ein
Beim Vergleich von 4 und 3 ist 4> 3, also wird 4 zurück verschoben

 while(j>=0 && arr[j]> key){
    
    
                        arr[j+1] = arr[j];
                        j--;
                }

Fügen Sie hier eine Bildbeschreibung ein

Fügen Sie hier eine Bildbeschreibung ein

Wiederholen Sie dann die obigen Schritte.

  • Code
#include <iostream>

using namespace std;



void Insert_Sort(int *arr, int len){
    
    
        int j,key;
        for(int i=1; i<len; i++){
    
    
                key = arr[i];
                j = i-1;
                while(j>=0 && arr[j]> key){
    
    
                        arr[j+1] = arr[j];
                        //swap(&arr[j+1], &arr[i]);
                        j--;
                }
                arr[j+1] = key;
                //swap(&arr[j+1], &key);
        }
}

int main(){
    
    
        int             len;
        cout << "please input len:";
        cin >> len;
        int arr[len];
        for(int i=0; i<len;i++){
    
    
                cout << "please input num:";
                cin >> arr[i];
        }
        Insert_Sort(arr,len);
        for(int i=0; i<len; i++){
    
    
                cout << arr[i] << " " ;
        }
        cout << "\n";
        return 0;
}

Ich denke du magst

Origin blog.csdn.net/qq_45125250/article/details/110152159
Empfohlen
Rangfolge