/******************************************************************************************** * 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