快速排序是由英國計算機科學家Tony Hoare於1960年發明的,至今仍然是最快的通用排序演算法之一。它的核心思想是進行分而治之,將數列分成較大和較小的兩個子數列,然後遞歸地排序這兩個子數列。
快速排序法簡介
快速排序的工作原理是選擇一個“基準”元素,然後將數列中所有的元素與這個基準元素進行比較,並將數列重新排序,使得基準元素左邊的所有元素都小於它,而右邊的所有元素都大於它。這個過程被稱為分區操作。
C++實現
以下是使用C++實現的快速排序法:
#include <iostream>
int partition(int arr[], int low, int high) {
int pivot = arr[high]; // 選擇最後一個元素作為基準
int i = (low - 1); // 索引i指向小於基準的元素
for (int j = low; j <= high - 1; j++) {
if (arr[j] < pivot) {
i++; // 增加小於基準的元素的索引
std::swap(arr[i], arr[j]);
}
}
std::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); // 遞歸地對基準元素右邊的數列進行排序
}
}
int main() {
int arr[] = {64, 34, 25, 12, 22, 11, 90};
int n = sizeof(arr) / sizeof(arr[0]);
quickSort(arr, 0, n-1);
std::cout << "Sorted array: ";
for (int i = 0; i < n; i++) {
std::cout << arr[i] << " ";
}
std::cout << std::endl;
return 0;
}
性能考慮
快速排序的平均和最好的時間複雜度是
。但在最壞的情況下,當數據已經是部分排序的或者當選擇的基準元素始終是數列中的最小或最大值時,其時間複雜度會退化為 。儘管如此,在實際應用中,快速排序通常都要比其他的 排序算法快得多。
在AI中的應用
快速排序的效率和實用性使其在AI中有很多應用場景,特別是在需要快速排序大量數據的場合,如在某些機器學習演算法中的數據預處理階段。