Skip to content

Commit 3c175d2

Browse files
committed
Merge branch 'wyh267-master'
2 parents 4dcf7e6 + e82f87f commit 3c175d2

File tree

3 files changed

+414
-0
lines changed

3 files changed

+414
-0
lines changed

Makefile

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,7 @@ PROGRAMS = m_based_demo \
6161
disjoint-set_demo \
6262
relabel_to_front_demo \
6363
btree_demo \
64+
sort_demo \
6465
fib-heap_demo
6566

6667
all: $(PROGRAMS)

include/sort.h

Lines changed: 296 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,296 @@
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

Comments
 (0)