/* 快速排序
** 基本思想:
** (1) 先从数列中取出一个数作为基准数
** (2) 分区过程,将比这个数大的数全放到它的右边,其他的放到它的左边
** (3) 再对左右区间重复第二步,直到各区间只有一个数
** 参数说明:
** pData : 输入的数组
** nLen : 数组的长度
** nStart: pData中开始排序的位置,从0开始
** nEnd : pData中排序结束的位置,从0开始
*/
template<class Type>
void QuikSort(Type *pData, int nLen, int nStart, int nEnd)
{
if(nEnd <= nStart && nStart >= 0)
return;
// 首先执行一次排序:将比beginData小的放到左边,其他放到右边
Type beginData = pData[nStart];
Type ntemp;
int beginIndex = nStart;
for(int i=nStart+1; i<=nEnd; i++)
{
if(pData[i] <= beginData) // 从beginIndex开始,将数据往后挪,直到i
{
ntemp = pData[i];
for(int j=i-1; j>=beginIndex; j--)
{
pData[j+1] = pData[j];
}
// 将小数据挪到前面去
pData[beginIndex] = ntemp;
// 基准数的位置后移了一位
beginIndex++;
}
}
// 对其他的区间的对象进行再排序
QuikSort(pData, nLen, nStart, beginIndex-1);
QuikSort(pData, nLen, beginIndex+1, nEnd);
}