归并排序
归并排序具有递归和非递归两种方式:
递归的归并排序代码如下:
1 #include <iostream> 2 #include <list> 3 #include <stack> 4 using namespace std; 5 //合并排序的前期判断,将不符合归并排序的数组进行筛除, 6 //申请归并排序的辅助数组空间 7 void MergeSort(int *p, int n) 8 { 9 void Msort(int *p, int *temp,int left, int right); 10 if(n <= 0 || p == NULL) 11 return; 12 int *temp = new int[n]; 13 if(temp == NULL) 14 return; 15 Msort(p, temp, 0, n-1); 16 delete [] temp; 17 } 18 //递归形式的合并排序 19 void Msort(int *p, int *temp, int left, int right) 20 { 21 void Merge(int *, int *, int, int, int); 22 if(left < right) 23 { 24 int leftend = (left + right) / 2; 25 int rightbegin = leftend + 1; 26 Msort(p, temp, left, leftend); 27 Msort(p, temp, rightbegin, right); 28 Merge(p, temp,left, rightbegin, right); 29 } 30 } 31 //将数组中指定长度的两段,按照一定大小进行合并。 32 void Merge(int *p, int *temp, int left, int rightbegin, int right) 33 { 34 int TempArray = rightbegin; 35 int pos = left; 36 int begin = left; 37 while(left < TempArray && rightbegin <= right) 38 { 39 if(p[left] <= p[rightbegin]) 40 temp[pos++] = p[left++]; 41 else 42 temp[pos++] = p[rightbegin++]; 43 } 44 while(left < TempArray) 45 temp[pos++] = p[left++]; 46 while(rightbegin <= right) 47 temp[pos++] = p[rightbegin++]; 48 while(pos-- >= begin) 49 p[pos] = temp[pos]; 50 } 51 52 int main() 53 { 54 //测试 55 int num = 9; 56 int *p = new int[num]; 57 for(int i = 0; i < num; i++) 58 p[i] = 10 - i; 59 for(int i = 0; i < num; i++) 60 cout << p[i] << endl; 61 MergeSort(p,num); 62 for(int i = 0; i < num; i++) 63 cout << p[i] << endl; 64 return 0; 65 }