1、思想
快速排序是分治思想。
2、步骤
1.在待排序的元素任取一个元素作为基准(通常选第一个元素,但最的选择方法是从待排序元素中随机选取一个作为基准),称为基准元素;
2.将待排序的元素进行分区,比基准元素大的元素放在它的右边,比其小的放在它的左边;
3.对左右两个分区重复以上步骤直到所有元素都是有序的。
3、代码
void quickSort(int left, int right)
{
int value = a[left];
int i = left;
int j = right;
if (left > right)
{
return;
}
//在这里,i<j是一个很重要的条件,自己写的时候忘记了
while (i<j)
{
while (a[j] >= value && i < j)
{
j--;
}
while (a[i] <= value && i < j)
{
i++;
}
if (i < j)
{
int t = a[j];
a[j] = a[i];
a[i] = t;
}
}
a[left] = a[i];
a[i] = value;
quickSort(left, i - 1);
quickSort(i + 1, right);
}
4、分析
快速排序的时间主要耗费在划分操作上,对长度为k的区间进行划分,共需k-1次关键字的比较。
1.当分区选取的基准元素为待排序元素中的最大或最小值时,为最坏的情况,时间复杂度为 O(n2)
T(n)=cn+T(n−1)=cn+c(n−1)+T(n−2)=2cn−c+T(n−2) …… =c[n(n+1)/2−1]+T(1)=O(n2)
2.当分区选取的基准元素为待排序元素中的”中值”,为最好的情况,时间复杂度为O(nlog2n)。
T(n)<=cn+2T(n/2)<=cn+2(cn/2+2T(n/4))=2cn+4T(n/4)<=2cn+4(cn/4+2T(n/8))=3cn+8T(n/8)…………<=cnlogn+nT(1)=O(nlogn) 其中cn 是一次划分所用的时间,c是一个常数
3.快速排序的空间复杂度为O(log2n).