Κοινή χρήση τεχνολογίας

[Ταξινόμηση-Γρήγορη ταξινόμηση]

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

Το Quick Sort είναι ένας αποτελεσματικός αλγόριθμος ταξινόμησης που βασίζεται στη στρατηγική διαίρει και βασίλευε. Η βασική ιδέα αυτού του αλγορίθμου ταξινόμησης είναι να επιλέξετε ένα στοιχείο αναφοράς, να χωρίσετε τον πίνακα σε δύο μέρη, έτσι ώστε τα στοιχεία στα αριστερά να είναι λιγότερα ή ίσα με το στοιχείο αναφοράς και τα στοιχεία στα δεξιά είναι μεγαλύτερα από ή ίσο με το στοιχείο αναφοράς και, στη συνέχεια, εφαρμόστε αναδρομικά τη γρήγορη ταξινόμηση στα δύο μέρη.

Βήματα αλγορίθμου:

  1. Επιλέξτε βασικό στοιχείο : Επιλέξτε ένα στοιχείο από τον πίνακα ως άξονα. Συνήθως το πρώτο στοιχείο, το τελευταίο στοιχείο ή ένα τυχαίο στοιχείο επιλέγεται ως βάση.

  2. Χώρισμα : Αναδιάταξη του πίνακα έτσι ώστε τα στοιχεία μικρότερα από το βασικό στοιχείο να βρίσκονται στην αριστερή πλευρά του βασικού στοιχείου και τα στοιχεία μεγαλύτερα από το στοιχείο βάσης να βρίσκονται στη δεξιά πλευρά. Ταυτόχρονα, το στοιχείο βάσης βρίσκεται στην τελική θέση ταξινόμησης.

  3. αναδρομική ταξινόμηση: Ταξινομήστε γρήγορα τους υποπίνακες στην αριστερή και δεξιά πλευρά του στοιχείου αναφοράς αναδρομικά.
    Εισαγάγετε την περιγραφή της εικόνας εδώ

Βήματα υλοποίησης:

Ο παρακάτω είναι ο κώδικας για την εφαρμογή γρήγορης ταξινόμησης στη γλώσσα C:

#include <stdio.h>

// 函数:交换数组中两个元素的值
void swap(int* a, int* b) {
    int temp = *a;
    *a = *b;
    *b = temp;
}

// 函数:将数组分区,并返回基准元素的位置(索引)
int partition(int arr[], int low, int high) {
    int pivot = arr[high];  // 选择最后一个元素作为基准
    int i = low - 1;  // 初始化分区索引,比基准元素小的元素会放在左边

    for (int j = low; j < high; j++) {
        // 如果当前元素小于或等于基准元素,则将它交换到分区的左边
        if (arr[j] <= pivot) {
            i++;  // 移动分区索引
            swap(&arr[i], &arr[j]);
        }
    }

    // 最后将基准元素交换到正确的位置
    swap(&arr[i + 1], &arr[high]);
    return i + 1;  // 返回基准元素的位置
}

// 函数:实现快速排序
void quickSort(int arr[], int low, int high) {
    if (low < high) {
        // 对数组进行分区
        int pi = partition(arr, low, high);

        // 对基准元素左边和右边的子数组进行递归排序
        quickSort(arr, low, pi - 1);
        quickSort(arr, pi + 1, high);
    }
}

// 函数:打印数组元素
void printArray(int arr[], int size) {
    for (int i = 0; i < size; i++) {
        printf("%d ", arr[i]);
    }
    printf("n");
}

// 主函数:测试快速排序的实现
int main() {
    int arr[] = {10, 7, 8, 9, 1, 5};
    int n = sizeof(arr) / sizeof(arr[0]);

    printf("原始数组: n");
    printArray(arr, n);

    quickSort(arr, 0, n - 1);

    printf("排序后的数组: n");
    printArray(arr, n);
    return 0;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61

Ανάλυση κώδικα:

  • λειτουργία ανταλλαγής: Χρησιμοποιείται για την ανταλλαγή των τιμών δύο στοιχείων σε έναν πίνακα.
  • λειτουργία κατάτμησης: Επιλέξτε το τελευταίο στοιχείο του πίνακα ως βάση, διαιρέστε τον πίνακα σε δύο μέρη και επιστρέψτε τον δείκτη τελικής θέσης του βασικού στοιχείου.
  • λειτουργία γρήγορης ταξινόμησης : Αναδρομικός αλγόριθμος για την εφαρμογή γρήγορης ταξινόμησης. Σε κάθε αναδρομή, η συνάρτηση κατάτμησης χρησιμοποιείται πρώτα για την κατάτμηση του πίνακα και, στη συνέχεια, τα δύο χωρισμένα μέρη ταξινομούνται αναδρομικά.
  • Λειτουργία printArray: Χρησιμοποιείται για την εκτύπωση στοιχείων πίνακα για εύκολη προβολή των αποτελεσμάτων ταξινόμησης.
  • κύρια λειτουργία: Δοκιμάστε την εφαρμογή της γρήγορης ταξινόμησης και εκτυπώστε τον πίνακα πριν και μετά την ταξινόμηση.

χρονική πολυπλοκότητα:

Η χρονική πολυπλοκότητα της γρήγορης ταξινόμησης εξαρτάται κυρίως από τη χρονική πολυπλοκότητα της λειτουργίας του διαμερίσματος και τον αριθμό των αναδρομικών κλήσεων. Η χρονική πολυπλοκότητα της γρήγορης ταξινόμησης είναι O(n^2) στη χειρότερη περίπτωση, αλλά O(n log n) στη μέση περίπτωση, καθιστώντας την έναν αποτελεσματικό αλγόριθμο ταξινόμησης.

Συνοψίζω:

Η γρήγορη ταξινόμηση επιτυγχάνει αποτελεσματική ταξινόμηση μέσω της στρατηγικής διαίρει και βασίλευε και των λειτουργιών κατάτμησης. Δεν απαιτεί επιπλέον χώρο αποθήκευσης (εκτός από το χώρο στοίβας για επαναλαμβανόμενες κλήσεις) και έχει καλή απόδοση υπό μέτριες συνθήκες. Επομένως, η γρήγορη ταξινόμηση είναι ένας από τους ευρέως χρησιμοποιούμενους αλγόριθμους ταξινόμησης σε πρακτικές εφαρμογές, ιδιαίτερα κατάλληλος για την ταξινόμηση εργασιών μεγάλων συνόλων δεδομένων.