C++的CArray快速排序
/********************************************************************************************
* MOD-NAME : QArray.h
* LONG-NAME : QuickSort algorithm enabled CArray
* AUTHOR : huangpf
* DEPARTMENT : XXX
* CREATION-DATE : 2010-06-25
* FUNCTION : 实现CARRAY的快速排序算法
*********************************************************************************************/
//////////////////////////////////////////////////////////////////////////
// 快速排序函数
//////////////////////////////////////////////////////////////////////////
//递归函数实现快速排序
template
<
class
T>
void
QuickSortRecursive(T *pArr,
int
d,
int
h,
BOOL
bAscending)
{
int
i,j;
T str;
i = h;
j = d;
str = pArr[((
int
) ((d+h) / 2))];
do
{
if
(bAscending) {
while
(pArr[j] < str) j++;
while
(pArr[i] > str) i--;
}
else
{
while
(pArr[j] > str) j++;
while
(pArr[i] < str) i--;
}
if
( i >= j ) {
if
( i != j ) {
T zal;
zal = pArr[i];
pArr[i] = pArr[j];
pArr[j] = zal;
}
i--;
j++;
}
}
while
(j <= i);
if
(d < i) QuickSortRecursive(pArr,d,i,bAscending);
if
(j < h) QuickSortRecursive(pArr,j,h,bAscending);
}
//////////////////////////////////////////////////////////////////////////
// 快速排序算法的入口
//
// T *pArr ... 需要排序的数组指针
// int iSize ... 待排序数组的大小
// BOOL bAscending ... 是否升序排序,默认升序
//
// 返回true执行成功,返回false执行失败,可以通过getlasterror()获得错误代码
template
<
class
T>
BOOL
QuickSort(T *pArr,
int
iSize,
BOOL
bAscending = TRUE)
{
BOOL
rc = TRUE;
if
(iSize > 1) {
try
{
int
low = 0,
high = iSize - 1;
QuickSortRecursive(pArr,low,high,bAscending);
}
catch
(...) {
::SetLastError(ERROR_INVALID_PARAMETER);
rc = FALSE;
}
}
else
{
::SetLastError(ERROR_INVALID_PARAMETER);
rc = FALSE;
}
return
rc;
}
//////////////////////////////////////////////////////////////////////////
// CQArray
//////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////
// CQArray declaration
template
<
class
T,
class
PT>
class
CQArray :
public
CArray <T, PT>
{
public
:
void
QuickSort(
BOOL
bAscending = TRUE);
};
//////////////////////////////////////////////////////////////////////////
// CQArray implementation
//////////////////////////////////////////////////////////////////////////
// QuickSort - 重定义CQArray 继承于CARRAY
//
template
<
class
T,
class
TP>
void
CQArray<T,TP>::QuickSort(
BOOL
bAscending
/* = TRUE*/
)
{
if
(GetSize() > 1) {
::QuickSort(GetData(),GetSize(),bAscending);
}
}
#endif