《算法导论》CLRS算法C++实现(四)P85 快速排序
第七章 快速排序
主要分为两个子算法,PARTITION(A, p, r)以A[r]为基准对数组进行一个划分,比A[r]小的放在左边,比A[r]大的放在右边。QUICKSORT(A, p, r)是快速排序的子程序,调用划分程序对数组进行划分,然后递归地调用QUICKSORT(A, p, r),以完成快速排序的过程。快速排序的最差时间复杂度为O(n2),平时时间复杂度为O(nlgn)。最差时间复杂度的情况为数组基本有序的时候,平均时间复杂度为数组的数值分布较为平均的时候。在平时情况下快速排序跟堆排序的时间复杂度都为O(nlgn),但是快速排序的常数项较小,所以要优于堆排序。
PARTITION(A, p, r)
1 x ← A[r] 2 i ← p - 1 3 for j ← p to r - 1 4 do if A[j] ≤ x 5 then i ← i + 1 6 swap(A[i], A[j]) 7 swap(A[i + 1], A[r]) 8 return i + 1
QUICKSORT(A, p, r)
1 if p < r 2 then q ← PARTITION(A, p, r) 3 QUICKSORT(A, p, q - 1) 4 QUICKSORT(A, q + 1, r)
C++代码实现
1 #include <iostream> 2 3 using namespace std; 4 5 void swap(int* x, int* y) 6 { 7 int temp; 8 temp = *x; 9 *x = *y; 10 *y = temp; 11 } 12 13 int partition(int* arr, int p, int r) 14 { 15 int x = arr[r]; 16 int i = p - 1; 17 int temp; 18 for(int j = p; j < r; j++) 19 { 20 if (arr[j] <= x) 21 { 22 i++; 23 swap(arr[i], arr[j]); 24 } 25 } 26 swap(arr[i + 1], arr[r]); 27 return ++i; 28 } 29 30 void quickSort(int* arr, int p, int r) 31 { 32 if(p < r) 33 { 34 int q = partition(arr, p, r); 35 quickSort(arr, p, q - 1); 36 quickSort(arr, q + 1, r); 37 } 38 } 39 40 41 int main() 42 { 43 int arr[] = {1, 3, 5, 23, 64, 7, 23, 6, 34, 98, 100, 9}; 44 quickSort(arr, 0, 11); 45 for(int i = 0; i < 11; i++) 46 { 47 cout << arr[i] << " "; 48 } 49 cout << endl; 50 return 0; 51 }