归并排序

归并排序的主要步骤是对子问题的合并,算法具体步骤请参考算法导论。

  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 }

 

 

posted on 2013-04-01 16:37  blue firmament  阅读(118)  评论(0编辑  收藏  举报