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
posted on 2011-03-04 17:05  carekee  阅读(1725)  评论(0编辑  收藏  举报