快速排序在最坏情况下的时间复杂度为O(n^2),虽然在最坏情况下运行时间比较差,但是快速排序通常是用于排序的最佳选择,因为其平均性能相当好,期望的运行时间为O(nlgn),且在O(nlgn)的记号中隐含的常数因子很小。
快速排序和合并排序有相似之处,都是需要划分序列,在合并排序中,划分的过程很简单,直接选择元素序列的中间位划分位置,排序是在合并的过程中实现的,所以合并排序的合并过程很重要;相比合并排序,快速排序就没有合并的过程,只有划分,快速排序的划分过程很重要,排序是在划分的过程中实现的。
/* * 算法导论 第七章 快速排序 * 最坏情况下时间复杂度为O(n^2),这种情况出现在每次选择pivot的时候 * 都选到了最大或者最小的元素,即每次划分都有一边为空。 * 其平均时间复杂度为O(nlgn),只要每次划分,每一边的元素都至少有一个就行 */ #include <iostream> using namespace std; void printArray(int arr[], int len) { for (int i=0; i<len; i++) { cout << arr[i] << " "; } cout << endl; } void quickSort(int arr[], int p, int r); int partition(int arr[], int p, int r); void exchange(int arr[], int i, int j); int main() { int arr[] = {12, 21, 9, 80, 3, 11, 90, 4, 67}; int len = sizeof(arr) / sizeof(arr[0]); cout << "原数组:" << endl; printArray(arr, len); quickSort(arr, 0, len-1); cout << "快速排序后的数组:" << endl; printArray(arr, len); } void quickSort(int arr[], int p, int r) { if (p < r) { int q = partition(arr, p, r); quickSort(arr, p, q-1); quickSort(arr, q+1, r); } } int partition(int arr[], int p, int r) { int pivot = arr[r]; int i = p - 1;//i前面的(包括i)的元素都是不大于pivot的,i后面的都是大于pivot的元素 int j;//j后面的(包括j)都是还没有划分的 for (j=p; j<=r-1; j++) { if (arr[j] <= pivot) { i++; exchange(arr, i, j); } } i++; exchange(arr, i, r); return i; } void exchange(int arr[], int i, int j) { int temp = arr[i]; arr[i] = arr[j]; arr[j] = temp; }
原文地址:http://blog.csdn.net/lucienduan/article/details/38469569