您的位置:首页 > 其它

排序算法之快速排序

2013-11-06 20:25 169 查看

一、基本思想

在算法中,分治是一种非常常见的方法,它将一个问题分成两个独立的子问题,子问题的规模相对较小,然后不断的递归下去最终解决问题,快速排序就是这样一个例子。

快速排序由C.A.R.Hoare发明,其大致思想是选择一个元素作为中枢值,将其插入到数组中合适位置,使得该元素前面的所有元素比它小,该元素后面的所有元素比它大,这样就将数组划分为两个子集,然后递归执行即可。

快速排序包含两个基本步骤:首先数组根据中枢值分成两个部分,左边元素小于等于中枢值,右边元素都大于中枢值;然后每个部分被递归的排序。

二、算法实现

void qSort(int* a, int left, int right) {
if (left >= right) {
return;
}
int zsv = a[left]; // 选取第一个元素为中枢值
int last = left, temp;
for (int p = left + 1; p <= right; p++) {
if (a[p] < zsv) {
++last;
temp = a[p], a[p] = a[last], a[last] = temp;
}
}
a[left] = a[last], a[last] = zsv;

// 递归
qSort(a, left, last - 1);
qSort(a, last + 1, right);
}

// 快速排序算法
void quickSort(int *a, int len) {
qSort(a, 0, len - 1);
}


三、算法分析

快速排序的时间复杂度为O(nlog2(n)).

快速排序算法在递归的每一步中大数组切分成两个小数组,如果其中一个集合为空,则快速排序会退化成一个二次方算法。因此,中枢值的选取对算法效率的影响非常关键。

通常关于中枢值的选择必须是高效的,不应该需要检查数组中所有元素:

选择第一个或者最后一个元素;
在数值中随机选择一个元素;
选择k中值:在A[left,left+n-1]随机选择k个元素,然后选择这k个元素的中值,通常k=3.

四、算法优化

快速排序算法的优化策略主要有:

消除递归;
选择基于三中值分区的中枢值;
设定一个切分数组长度的最小值,如果小于这个值就直接使用插入排序;
...
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: