排序算法

  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 }
原文地址:https://www.cnblogs.com/dzqdzq/p/3449282.html