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 }