快速排序在最坏情况下的时间复杂度为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