快速排序
来源:互联网 发布:恋爱软件 编辑:程序博客网 时间:2024/06/13 18:49
转自: http://blog.csdn.net/cjf_iceking/article/details/7925470
一. 算法描述
快速排序:快速排序采用分治法进行排序,首先是分割,选取数组中的任意一个元素value(默认选用第一个),将数组划分为两段,前一段小于value,后一段大于value;然后再分别对前半段和后半段进行递归快速排序。其实现细节如下图所示:
二. 算法分析
平均时间复杂度:O(nlog2n)
空间复杂度:O(logn) ~ O(n)
稳定性:不稳定
三. 算法实现
- /********************************************************
- *函数名称:Split
- *参数说明:pDataArray 无序数组;
- * iBegin为pDataArray需要快速排序的起始位置
- * iEnd为pDataArray需要快速排序的结束位置
- *函数返回:分割后的分割数位置
- *说明: 以iBegin处的数值value作为分割数,
- 使其前半段小于value,后半段大于value
- *********************************************************/
- int Split(int *pDataArray,int iBegin,int iEnd)
- {
- int pData = pDataArray[iBegin]; //将iBegin处的值作为划分值
- while (iBegin < iEnd) //循环分割数组,使其前半段小于pData,后半段大于pData
- {
- while (iEnd > iBegin && pDataArray[iEnd] >= pData) //从后向前寻找小于pData的数据位置
- iEnd--;
- if (iEnd != iBegin)
- {
- pDataArray[iBegin] = pDataArray[iEnd]; //将小于pData数据存放到数组前方
- iBegin++;
- while (iBegin < iEnd && pDataArray[iBegin] <= pData)
- iBegin++;
- if (iBegin != iEnd)
- {
- pDataArray[iEnd] = pDataArray[iBegin]; //将大于pData数据存放到数组后方
- iEnd--;
- }
- }
- }
- pDataArray[iEnd] = pData; //此时iBegin=iEnd,此处存储分割数据pData
- return iEnd;
- }
- /********************************************************
- *函数名称:QSort
- *参数说明:pDataArray 无序数组;
- * iBegin为pDataArray需要快速排序的起始位置
- * iEnd为pDataArray需要快速排序的结束位置
- *说明: 快速排序递归函数
- *********************************************************/
- void QSort(int* pDataArray, int iBegin, int iEnd)
- {
- if (iBegin < iEnd)
- {
- int pos = Split(pDataArray, iBegin, iEnd); //获得分割后的位置
- QSort(pDataArray, iBegin, pos - 1); //对分割后的前半段递归快排
- QSort(pDataArray, pos + 1, iEnd); //对分割后的后半段递归快排
- }
- }
- /********************************************************
- *函数名称:QuickSort
- *参数说明:pDataArray 无序数组;
- * iDataNum为无序数据个数
- *说明: 快速排序
- *********************************************************/
- void QuickSort(int* pDataArray, int iDataNum)
- {
- QSort(pDataArray, 0, iDataNum - 1);
- }
四. 算法优化(随机化版本)
快排选用数组第一个元素作为分割元素,如果是一个已经基本有序的数组,那么时间复杂度将会提升到O(n2);可以从数组中随机选择一个元素作为划分数据,这样即使针对基本有序的数据来说,效率同样达到(nlog2n),优化后分割函数如下所示:- int Split(int *pDataArray,int iBegin,int iEnd)
- {
- int rIndex = rand() % (iEnd - iBegin + 1); //随机获得偏移位置
- int pData = pDataArray[iBegin + rIndex]; //将iBegin+rIndex处的值作为划分值
- //Here need to exchange the value of pDataArray[iBegin + rIndex] and pDataArray[iBegin]
- int pDataArray[iBegin + rIndex] = pDataArray[iBegin];
- pDataArray[iBegin] = pData;
- while (iBegin < iEnd) //循环分割数组,使其前半段小于pData,后半段大于pData
- {
- while (iEnd > iBegin && pDataArray[iEnd] >= pData) //从后向前寻找小于pData的数据位置
- iEnd--;
- if (iEnd != iBegin)
- {
- pDataArray[iBegin] = pDataArray[iEnd]; //将小于pData数据存放到数组前方
- iBegin++;
- while (iBegin < iEnd && pDataArray[iBegin] <= pData)
- iBegin++;
- if (iBegin != iEnd)
- {
- pDataArray[iEnd] = pDataArray[iBegin]; //将大于pData数据存放到数组后方
- iEnd--;
- }
- }
- }
- pDataArray[iEnd] = pData; //此时iBegin=iEnd,此处存储分割数据pData
- return iEnd;
- }
0 0
- 快速排序
- 快速排序
- 快速排序
- 快速排序!
- 快速排序
- 快速排序
- 快速排序
- 快速排序
- 快速排序
- 快速排序
- 快速排序
- 快速排序
- 快速排序
- 快速排序
- 快速排序
- 快速排序
- 快速排序
- 快速排序
- 向量叉乘求任意多边形面积
- hdu 3016线段树之七
- C#中的@符号用法
- Mac OSX 10.9搭建nginx+mysql+php-fpm环境
- C++之练习题36
- 快速排序
- android APK签名
- Jquery,添加/删除一行输入标签
- yum更新为163的源。
- jdbc.properties 包含多种数据库驱动链接版本
- 设计模式 之 代理模式
- ArcEngine中的几种地图刷新模式
- HDFS自动故障转移配置
- mysql中OPTIMIZE TABLE的作用