Develop and Download Open Source Software

Browse Subversion Repository

Annotation of /WinCS/SortArray.h

Parent Directory Parent Directory | Revision Log Revision Log


Revision 11 - (hide annotations) (download) (as text)
Wed Feb 10 18:21:00 2010 UTC (14 years, 2 months ago) by sho1get
File MIME type: text/x-chdr
File size: 2195 byte(s)


1 sho1get 11 #pragma once
2    
3     //////////////////////////////////////////////////////////////////////////
4    
5     template <class TYPE, class ARG_TYPE = TYPE>
6     class CSortArray : public CArray <TYPE, ARG_TYPE>
7     {
8     public:
9     CSortArray() {}
10     virtual ~CSortArray() {}
11    
12     void QuickSort(BOOL bAscending = TRUE);
13    
14     protected:
15     BOOL doQuickSort(TYPE *pArr, int nSize, BOOL bAscending = TRUE);
16     void doQuickSortRecursive(TYPE *pArr, int d, int h, BOOL bAscending);
17     };
18    
19     //////////////////////////////////////////////////////////////////////////
20    
21     template <class TYPE, class ARG_TYPE>
22     inline void CSortArray<TYPE, ARG_TYPE>::doQuickSortRecursive(TYPE *pArr, int d, int h, BOOL bAscending)
23     {
24     int i, j, pvt;
25     TYPE src, tmp;
26    
27     i = h;
28     j = d;
29     pvt = static_cast<UINT>((d + h) / 2);
30     src = pArr[pvt];
31    
32     do
33     {
34     if (bAscending)
35     {
36     while (pArr[j] < src) j++;
37     while (pArr[i] > src) i--;
38     }
39     else
40     {
41     while (pArr[j] > src) j++;
42     while (pArr[i] < src) i--;
43     }
44    
45     if (i >= j)
46     {
47    
48     if (i != j)
49     {
50     tmp = pArr[i];
51     pArr[i] = pArr[j];
52     pArr[j] = tmp;
53    
54     }
55    
56     i--;
57     j++;
58     }
59     }
60     while (j <= i);
61    
62     if (d < i) doQuickSortRecursive(pArr, d, i, bAscending);
63     if (j < h) doQuickSortRecursive(pArr, j, h, bAscending);
64     }
65    
66     //////////////////////////////////////////////////////////////////////////
67    
68     template <class TYPE, class ARG_TYPE>
69     inline BOOL CSortArray<TYPE, ARG_TYPE>::doQuickSort(TYPE *pArr, int nSize, BOOL bAscending)
70     {
71     BOOL rc = TRUE;
72     int low, high;
73    
74     if (nSize > 1)
75     {
76     try
77     {
78     low = 0;
79     high = nSize - 1;
80    
81     doQuickSortRecursive(pArr, low, high, bAscending);
82     }
83     catch (...)
84     {
85     ::SetLastError(ERROR_INVALID_PARAMETER);
86     rc = FALSE;
87     }
88     }
89     else
90     {
91     ::SetLastError(ERROR_INVALID_PARAMETER);
92     rc = FALSE;
93     }
94    
95     return rc;
96     }
97    
98     //////////////////////////////////////////////////////////////////////////
99    
100     template <class TYPE, class ARG_TYPE>
101     inline void CSortArray<TYPE, ARG_TYPE>::QuickSort(BOOL bAscending/* = TRUE*/)
102     {
103     if (GetSize() > 1)
104     {
105     doQuickSort(GetData(), GetSize(), bAscending);
106     }
107     }
108    
109     //////////////////////////////////////////////////////////////////////////

Back to OSDN">Back to OSDN
ViewVC Help
Powered by ViewVC 1.1.26