快速排序是对冒泡排序的一种改进。它采用了分治的策略。一般可分为3步:
(1) 分解:即寻找基准(pivot),将比pivot小的数全部放到左边,比pivot大的数放到右边。
(2) 求解:通过递归调用实现左右子区间的快速排序。
(3) 组合:就是对有序的左右子区间组合,但对快速排序而言,这个步骤可看成空操作。
表2-1 快速排序的时间复杂度
初始状态 | 最好 | 最坏 | 无序(平均) |
第i趟的键比较次数 | 即每次取的pivot为中值,左右子区间大小相等。 | n-i(每次划分的区间为n-i+1,选取的pivot不是最大就是最小,即划分后的子区间只比原来小1) |
|
总的键比较次数 | n(n-1)/2 | ||
时间复杂度 | O(n*lb(n)) | O(n^2) | O(n*lb(n)) |
表2-1 快速排序的空间复杂度
快速排序需要一个栈来实现递归,每层递归调用的指针和参数均用栈来存放,若每次划分较均匀,则其递归树的高度为O(lb(n))。最坏的情况下,递归树是一个单支树,则其递归树的高度为O(n)。快速排序是一种不稳定的排序。 |
// quicksort.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
void quick_sort(int *a,int left,int right)
{
int l=left,r=right;
//choose the first number to be sentry
int k=a[l];
if(l>=r) return ;
while(l!=r)
{
while(l<r&& a[r]>=k)
r--;
a[l]=a[r];
while(l<r&& a[l]<=k)
l++;
a[r]=a[l];
}
a[l]=k;
quick_sort(a,left,l-1);
quick_sort(a,l+1,right);
}
int _tmain(int argc, _TCHAR* argv[])
{
int a[]={46,58,15,45,90,18,10,62};
quick_sort(a,0,7);
return 0;
}