1 #include <iostream>
2 #include <vector>
3 using namespace std ;
4
5 #define INFINITE 1000
6 //主菜单
7 void MainMenu()
8 {
9 cout << "****************************************" << endl ;
10 cout << "* 1.InsertSort *" << endl ;
11 cout << "* *" << endl ;
12 cout << "* 2.BubbleSort *" << endl ;
13 cout << "* *" << endl ;
14 cout << "* 3.MergeSort *" << endl ;
15 cout << "* *" << endl ;
16 cout << "* 4.HeapSort *" << endl ;
17 cout << "* *" << endl ;
18 cout << "* 0.Exit *" << endl ;
19 cout << "****************************************" << endl ;
20 }
21
22 //输入函数
23 template<class T >
24 void Input(vector<T >& v , int num)
25 {
26 v.resize(num);
27 for (int i = 0; i < num;++ i)
28 {
29 cin >> v[i];
30 }
31 cout << endl ;
32 }
33 //输出函数
34 template<class T >
35 void print(vector<T>& v,int num)
36 {
37 v.resize(num);
38 for (int i = 0; i < num;++ i)
39 {
40 cout << v[i] << " ";
41 }
42 cout << endl ;
43 }
44
45 /***************************以下代码实现插入排序*****************************/
46
47 template<class T>
48 void InsertSort(vector<T>& v , int size)
49 {
50 for (int i = 1;i<size;++i)
51 {
52 int t = v[i];
53 int j = i;
54 while (j>0 && v[j-1]>t)
55 {
56 v[j]=v[j-1];
57 --j;
58 }
59 v[j] = t;
60 }
61 }
62 /***************************以下代码实现冒泡排序*****************************/
63
64 template<class T>
65 void BubbleSort(vector<T > &v,int n)
66 {
67 v.resize(n);
68 for (int i = n-2;i>=0;--i)
69 {
70 for (int j = 0;j<=i;++j)
71 {
72 if(v[j+1]<v[j])
73 {
74 int t = v[j+1];
75 v[j+1]=v[j];
76 v[j]=t;
77 }
78
79 }
80 }
81
82 }
83 /***************************以下代码实现归并排序*****************************/
84
85 template<class T>
86 void merge(vector<T>& v,int start,int mid,int end)
87 {
88 int i,j,k;
89 //申请辅助数组
90 int *array1 = new int[mid-start+2];
91 int *array2 = new int[end-mid+1];
92
93 //把a从mid分开分别赋值给数组
94 for(i=0;i<mid-start+1;i++)
95 *(array1+i)=v[start+i];
96 *(array1+i)=INFINITE;//作为哨兵
97 for(i=0;i<end-mid;i++)
98 *(array2+i)=v[i+mid+1];
99 *(array2+i)=INFINITE;
100 //有序的归并到数组a中
101 i=j=0;
102 for(k=start;k<=end;k++){
103 if(*(array1+i) > *(array2+j)){
104 v[k]=*(array2+j);
105 j++;
106 }
107 else{
108 v[k]=*(array1+i);
109 i++;
110 }
111 }
112 delete []array1;
113 delete []array2;
114 }
115
116 //归并排序
117 template<class T>
118 void mergeSort(vector<T>& v,int start,int end)
119 {
120 int mid=(start+end)/2;
121 if(start<end){
122 //分解
123 mergeSort(v,start,mid);
124 mergeSort(v,mid+1,end);
125 //合并
126 merge(v,start,mid,end);
127 }
128 }
129
130 /***************************以下代码实现堆排序*****************************/
131 /*求父亲*/
132 int parent(int i)
133 {
134 return (int)floor((i) / 2); //floor函数为向下取整
135 }
136
137 /*求左孩子*/
138 int left(int i)
139 {
140 return (2 * i);
141 }
142
143 /*求右孩子*/
144 int right(int i)
145 {
146 return (2 * i + 1);
147 }
148
149 void Max_Heapify(vector<int>& A, int i, int heap_size)
150 {
151 int l = left(i);
152 int r = right(i);
153 int largest;
154
155 /*找到父亲 左孩子 右孩子 之间的最大值*/
156 if(l <heap_size && A[l] > A[i])
157 {
158 largest = l;
159 }
160 else
161 {
162 largest = i;
163 }
164 if(r <heap_size && A[r] > A[largest])
165 {
166 largest = r;
167 }
168 /*如果父亲不是最大的,则把父亲和两个孩子的较大值交换 */
169 if(largest != i)
170 {
171 swap(A[largest],A[i]);
172 /*交换之后破坏了较大孩子的堆得性质,对其进行调整*/
173 Max_Heapify(A, largest, heap_size);
174 }
175 }
176 void Build_Max_Heap(vector<int>& A,int size)
177 {
178 int begin = size/2 ; // 堆顶元素
179 for(int i = begin; i >= 0; i--)
180 {
181 Max_Heapify(A, i, size);
182 }
183 }
184 void HeapSort(vector<int>& A, int heap_size)
185 {
186 Build_Max_Heap(A,heap_size);
187 //建立大顶堆之后 堆顶已经是所有元素中最大的了
188
189 //a[0]是数组的第一个元素 a[heap_size - 1]是数组的最后一个元素
190 /*将堆顶依次和最后一个叶子节点交换 */
191 for(int i = heap_size - 1; i >= 0; i--)
192 {
193 swap(A[i],A[0]);
194 //交换之后破坏了堆得性质 重新调整 */
195 Max_Heapify(A, 0, i); //i 是元素个数 每交换依次元素就少一个
196 }
197 }
198
199 int main()
200 {
201 MainMenu();
202 vector<int> v ;
203 int num = 0;
204 while (1)
205 {
206 int menu;
207 cout << "Choice the method of sorting:";
208 cin >> menu;
209 cout << endl;
210 if (menu == 0)
211 {
212 cout << "退出系统" << endl ;
213 break;
214 }
215 cout << "Input the num of element will be sorted:";
216 cin >> num ;
217 cout << endl;
218 cout<<"The origin array:";
219 Input(v,num);
220 cout << "before sorted:";
221 print(v,num);
222 switch (menu)
223 {
224 case 1:
225 InsertSort(v,num);
226 break;
227 case 2:
228 BubbleSort(v,num);
229 break;
230 case 3:
231 mergeSort(v,0,num-1);
232 break;
233 case 4:
234 HeapSort(v,num);
235 break;
236 default:
237 break;
238 }
239 cout << endl ;
240 cout << "after sorted:";
241 print(v,num);
242 cout<<endl;
243
244 }
245 system("pause");
246 return 0;
247 }