/* FUNCTION_BEG *****************************************************
函数名: QueckSort
功能: 对输入数组执行快速排序
算法: 由C. A. R. Hoare在1962年提出。它的基本思想是:
通过一趟排序将要排序的数据分割成独立的两部分,
其中一部分的所有数据都比另外一部分的所有数据
都要小,然后再按此方法对这两部分数据分别进行
快速排序,整个排序过程可以递归进行,以此达到
整个数据变成有序序列。
FUNCTION_END ******************************************************/
#ifndef H_QUECKSORT_H
#define H_QUECKSORT_H
#include <memory>
/* 数组顺序排序算法
@apArray 数组
@asSize 数组长度(不包括结尾)
缺陷: 内存碎片,稍后把内存池接进来*/
template <class T>
void TQueckSortP(T* apArray, size_t asSize)
{
// 数组大于1时
if (asSize > 1)
{
T* lszTempArray = new T[asSize*2];
memset(lszTempArray, 0, sizeof(T)*asSize*2);
size_t liLeftPos = asSize;
size_t liRightPos = asSize;
lszTempArray[asSize] = apArray[0];
for (size_t i = 1; i< asSize; ++i)
{
if (apArray[i] <= apArray[0])
{
--liLeftPos;
lszTempArray[liLeftPos] = apArray[i];
}
else
{
++liRightPos;
lszTempArray[liRightPos] = apArray[i];
}
}
memcpy(apArray, &lszTempArray[liLeftPos], sizeof(T)* asSize);
delete [] lszTempArray;
TQueckSortP(apArray, (asSize - liLeftPos));
TQueckSortP(apArray+(asSize - liLeftPos)+1 ,(liRightPos - asSize));
}
}
/* 数组逆序排序算法
@apArray 数组
@asSize 数组长度*/
template <class T>
void TQueckSortR(T* apArray, size_t asSize)
{
// 数组大于1时
if (asSize > 1)
{
T* lszTempArray = new T[asSize*2];
memset(lszTempArray, 0, sizeof(T)*asSize*2);
size_t liLeftPos = asSize;
size_t liRightPos = asSize;
lszTempArray[asSize] = apArray[0];
for (size_t i = 1; i< asSize; ++i)
{
if (apArray[i] >= apArray[0])
{
--liLeftPos;
lszTempArray[liLeftPos] = apArray[i];
}
else
{
++liRightPos;
lszTempArray[liRightPos] = apArray[i];
}
}
memcpy(apArray, &lszTempArray[liLeftPos], sizeof(T)* asSize);
delete [] lszTempArray;
TQueckSortR(apArray, (asSize - liLeftPos));
TQueckSortR(apArray+(asSize - liLeftPos)+1 ,(liRightPos - asSize));
}
}
#endif//H_QUECKSORT_H