********************************************************
*函数名称: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);
}
快速排序:快速排序采用分治法进行排序,首先是分割,选取数组中的任意一个元素value(默认选用第一个),将数组划分为两段,前一段小于value,后一段大于value;然后再分别对前半段和后半段进行递归快速排序。其实现细节如下图所示:
平均时间复杂度:O(nlog2n)
空间复杂度:O(n)
稳定性:不稳定