1+ #ifndef _SORT_H_
2+ #define _SORT_H_
3+
4+
5+ #include < iostream>
6+ #include < vector>
7+
8+
9+ using namespace std ;
10+
11+ namespace alg {
12+
13+ template <typename T>
14+ class SortClass {
15+ public:
16+ SortClass (vector<T>& sort_list,bool (*comp)(T,T),void (*_swap)(T&,T&)){
17+ m_sort_list=&sort_list;
18+ compre=comp;
19+ swap=_swap;
20+ }
21+
22+
23+ ~SortClass (){
24+
25+ }
26+
27+ //
28+ // 插入排序法
29+ //
30+ void insertSort (){
31+ int j;
32+ T temp;
33+ for (size_t i = 1 ; i < (*m_sort_list).size (); ++i)
34+ {
35+ temp=(*m_sort_list)[i];
36+ j=i-1 ;
37+ while ((j>=0 ) && (compre ((*m_sort_list)[j],temp)==true )){
38+ (*m_sort_list)[j+1 ] = (*m_sort_list)[j];
39+ j--;
40+ }
41+ (*m_sort_list)[j+1 ] = temp;
42+ /* code */
43+ }
44+
45+ }
46+
47+
48+ //
49+ // 冒泡排序法
50+ //
51+ void bubbleSort (){
52+
53+ for (size_t i = 0 ; i < (*m_sort_list).size (); ++i)
54+ {
55+ for (size_t j = i+1 ; j < (*m_sort_list).size (); ++j)
56+ {
57+ if (compre ((*m_sort_list)[i],(*m_sort_list)[j])==true ){
58+
59+ swap ((*m_sort_list)[i],(*m_sort_list)[j]);
60+
61+ }
62+
63+ }
64+
65+ }
66+
67+ }
68+
69+
70+ //
71+ // 快速排序
72+ //
73+ void quickSort (){
74+ _quickSort ((*m_sort_list),0 ,(*m_sort_list).size ()-1 );
75+ }
76+
77+
78+ //
79+ // 选择排序
80+ //
81+ void selectionSort (){
82+
83+ int min_index;
84+
85+ for (size_t i = 0 ; i < (*m_sort_list).size ()-1 ; ++i)
86+ {
87+ min_index=i;
88+ for (size_t j = i+1 ; j < (*m_sort_list).size (); ++j)
89+ {
90+ if ( compre ((*m_sort_list)[min_index],(*m_sort_list)[j]) == true )
91+ min_index=j;
92+
93+ }
94+
95+ if (i != min_index)
96+ {
97+ swap ((*m_sort_list)[min_index],(*m_sort_list)[i]);
98+
99+ }
100+ }
101+
102+ }
103+
104+
105+ //
106+ // 归并排序
107+ //
108+ void mergeSort (){
109+
110+ _mergeSort (1 );
111+
112+ }
113+
114+
115+ //
116+ // 堆排序
117+ //
118+ void heapSort (){
119+
120+ buildHeap ();
121+ for (int i = (*m_sort_list).size ()-1 ; i > 0 ; --i)
122+ {
123+ swap ((*m_sort_list)[0 ],(*m_sort_list)[i]);
124+
125+ adjHeap (0 ,i);
126+
127+ }
128+ }
129+
130+
131+
132+ void displaySort (){
133+
134+ for (size_t i = 0 ; i < (*m_sort_list).size (); ++i)
135+ {
136+ cout << (*m_sort_list)[i] << " ," ;
137+
138+ }
139+ cout << endl;
140+
141+ }
142+
143+
144+
145+
146+ private:
147+ vector<T> *m_sort_list;
148+ vector<T> m_merge_list;
149+ bool (*compre)(T,T);
150+ void (*swap)(T&,T&);
151+
152+ //
153+ // 归并排序具体实现,双路归并
154+ //
155+ void _mergeSort (int len){
156+
157+ if (len>(*m_sort_list).size ())
158+ return ;
159+
160+ m_merge_list.clear ();
161+ for (size_t i = 0 ; i < (*m_sort_list).size (); i+=len*2 )
162+ {
163+
164+ int j=i;
165+ int k=i+len;
166+ int maxj = ( i+len >= (*m_sort_list).size () ) ? (*m_sort_list).size () : (i+len);
167+ int maxk = ( i+2 *len >= (*m_sort_list).size () ) ? (*m_sort_list).size () : (i+2 *len);
168+
169+ while ((j<maxj) && (k<maxk) )
170+ {
171+ if ( compre ((*m_sort_list)[k],(*m_sort_list)[j]))
172+ {
173+ m_merge_list.push_back ((*m_sort_list)[j]);
174+ j++;
175+ }else {
176+ m_merge_list.push_back ((*m_sort_list)[k]);
177+ k++;
178+ }
179+ }
180+
181+ if (j==maxj){
182+ for (size_t ii = k; ii < maxk; ++ii)
183+ {
184+ m_merge_list.push_back ((*m_sort_list)[ii]);
185+ }
186+ }else
187+ {
188+ for (size_t ii = j; ii < maxj; ++ii)
189+ {
190+ m_merge_list.push_back ((*m_sort_list)[ii]);
191+ }
192+ }
193+
194+ }
195+
196+ *m_sort_list= m_merge_list;
197+
198+
199+ _mergeSort (len*2 );
200+
201+ }
202+
203+ //
204+ // 堆排序,调整堆
205+ //
206+ void adjHeap (int start,int size){
207+
208+
209+
210+ int left=start*2 +1 ;
211+ int right=start*2 +2 ;
212+
213+
214+ if ( ( compre ((*m_sort_list)[start],(*m_sort_list)[left]) == false ) &&left < size){
215+
216+ swap ((*m_sort_list)[start],(*m_sort_list)[left]);
217+
218+
219+ adjHeap (left,size);
220+ }
221+
222+ if ( ( compre ((*m_sort_list)[start],(*m_sort_list)[right]) == false ) && right < size){
223+ swap ((*m_sort_list)[start],(*m_sort_list)[right]);
224+
225+
226+ adjHeap (right,size);
227+ }
228+
229+
230+ return ;
231+
232+
233+ }
234+
235+ //
236+ // 堆排序,建立堆
237+ //
238+ void buildHeap (){
239+
240+ for (int i = ((*m_sort_list).size ()-1 )/2 ; i >= 0 ; --i)
241+ {
242+ adjHeap (i,(*m_sort_list).size ());
243+ }
244+
245+
246+ }
247+
248+
249+ //
250+ // 快速排序具体实现
251+ //
252+ void _quickSort (vector<T>& arr,int start,int end){
253+
254+ int i,j;
255+ i = start;
256+ j = end;
257+ if ((arr.size ()==0 ))
258+ return ;
259+
260+ while (i<j){
261+
262+ while (i<j && compre (arr[j],arr[i])){
263+ j--;
264+ }
265+ if (i<j){
266+ swap (arr[i],arr[j]);
267+
268+
269+ }
270+
271+
272+ while (i<j&&compre (arr[j],arr[i])){
273+ i++;
274+ }
275+ if (i<j){
276+ swap (arr[i],arr[j]);
277+
278+ }
279+ }
280+
281+ if (i-start>1 ){
282+ _quickSort (arr,start,i-1 );
283+ }
284+
285+ if (end-j>1 ){
286+ _quickSort (arr,j+1 ,end);
287+ }
288+ }
289+
290+ };
291+
292+
293+ }
294+
295+
296+ #endif
0 commit comments