排序算法之快速排序
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.
四、算法优化
快速排序算法的优化策略主要有:消除递归;
选择基于三中值分区的中枢值;
设定一个切分数组长度的最小值,如果小于这个值就直接使用插入排序;
...
相关文章推荐
- 排序算法之快速排序的C++实现
- 排序算法(堆排序、插入排序、归并排序、快速排序)
- 排序算法-快速排序(三种实现方案)
- 排序算法之快速排序
- 排序算法之快速排序
- 排序算法总结(6)——快速排序
- 排序算法——快速排序
- 常用排序算法笔记之冒泡排序、快速排序
- java算法(一)——排序算法(下)之 快速排序
- C语言常用的几种排序算法代码(选择排序,冒泡排序,插入排序,快速排序)
- 排序算法(5)—快速排序
- 排序算法-->直接排序,冒泡排序,快速排序
- 排序算法(Java语言)——快速排序
- 排序算法——快速排序
- 排序算法学习- 快速排序
- 排序算法之--从冒泡排序到快速排序
- 排序算法之快速排序
- 排序算法之快速排序(Java)
- 排序算法之快速排序
- 排序算法(三)------冒泡排序和快速排序