归并排序
归并排序的主要步骤是对子问题的合并,算法具体步骤请参考算法导论。
1 #ifndef MERGE_SORT_H 2 #define MERGE_SORT_H 3 4 #include <iostream> 5 6 using namespace std; 7 8 /************************************************* 9 Function: // merg_sort 10 Description: // 归并排序实现 11 Input: // array:输入待排序数组 12 Input: // begin:数组起始下标 13 // end: 数组末尾元素下标 14 Output: // 无 15 Return: // 无 16 *************************************************/ 17 template<class T> void merg_sort(T *array, int begin, int end) 18 { 19 if (end > begin) 20 { 21 int mid = (begin + end) / 2; 22 merg_sort(array, begin, mid); 23 merg_sort(array, mid + 1, end); 24 merg(array, begin, mid, end); 25 } 26 } 27 28 /************************************************* 29 Function: // merg 30 Description: // 对两个数组进行归并 31 Input: // array:输入待排序数组 32 Input: // begin:数组起始下标 33 // end: 数组末尾元素下标 34 // mid: 两个数组的中间分隔元素下标 35 Output: // 无 36 Return: // 无 37 *************************************************/ 38 template<class T> void merg(T *array, int begin, int mid, int end) 39 { 40 int temp = end - begin + 1; 41 int temp1 = mid - begin + 1; 42 int temp2 = end - mid; 43 T *array1 = new T[temp1]; 44 T *array2 = new T[temp2]; 45 int i, j, k; 46 for(i = 0; i < temp1; ++i) 47 { 48 array1[i] = array[begin + i]; 49 } 50 for(j = 0; j < temp2; ++j) 51 { 52 array2[j] = array[mid + 1 + j]; 53 } 54 i = j = 0; 55 56 //对已排序的两个数组进行归并,形成一个已排好序的数组 57 for(k = 0; k < temp; k++) 58 { 59 if(i < temp1 && j < temp2) 60 { 61 array[begin + k] = array1[i] > array2[j]? array1[i++]:array2[j++]; 62 } 63 else 64 { 65 break; 66 } 67 } 68 while(i < temp1) 69 { 70 array[begin + k++] = array1[i++]; 71 } 72 while (j < temp2) 73 { 74 array[begin + k++] = array2[j++]; 75 } 76 delete []array2; 77 delete []array1; 78 } 79 #endif 80 81 82 #include <iostream> 83 #include <ctime> 84 #include <random> 85 #include "mergsort.h" 86 87 using namespace std; 88 89 #define NUM 5 90 91 int main() 92 { 93 int array[NUM]; 94 srand(time(0)); 95 int i; 96 for(i = 0; i < NUM; i++) 97 { 98 array[i] = rand() % 100; 99 } 100 for(i = 0; i < NUM; i++) 101 { 102 cout << array[i] << " "; 103 } 104 cout << endl; 105 merg_sort(array, 0, NUM - 1); 106 for(i = 0; i < NUM; i++) 107 { 108 cout << array[i] << " "; 109 } 110 cout << endl; 111 return 0; 112 }