使用C++实现归并排序(非vector版本)

归并排序是分冶算法的一种很好的体现,即分而治之,把一个庞大的问题,逐步分解为几个小问题,然后对这些小问题进行逐步求解。
比如有一个数组,其中的元素分别为:2 ,5, 1 ,6 ,9 ,13 ,-4, 5, 10, 4;
首先 , 将他们都分为一个元素的集合, 很容易知道 , 单个元素的集合一定是有序的 即: 2 ; 5 ; 1 ; 6 ; 9 ; 13 ; -4 ; 5 ; 10 ;4.每一个都是有序的
接下来将他们两两归并(从小到大排) :2,5; 1 , 6 ; 9 , 13 ; -4 , 5 ; 4 ,10;
再进行上述步骤 , 即 : 1 , 2 , 5 , 6 ; -4 , 5 , 9 , 13; 4 , 10;

下面是代码实现:

#include
using namespace std;
void mymerge(int *result , int start , int ended)  //这里是上述的将两个集合组合起来的函数
{
    int mid = (start + ended) >> 1;  //从中间分,利用了二分的思想,貌似也可以用什么斐波拉契分,但本dd不会。。
      int len1 = mid - start + 1;   //左边的长度
      int len2 = ended - mid;       //右边的长度
        int *l = new int[len1];        
        int *r = new int[len2];         //分配新的内存空间
          for(int i = 0 ; i < len1 ; i++)
            l[i] = result[start + i];
          for(int j = 0 ; j < len2 ; j++)
            r[j] = result[mid+1+j];     //复制数组内容
              int index1 = 0 , index2 = 0;
              while( index1 < len1 && index2 < len2)   //这里是将两个数组合并
              {
                  if(l[index1] < r[index2]) result[start++] = l[index1++];
                  else result[start++] = r[index2++];
              }
    while(index1 < len1) result[start++] = l[index1++];
    while(index2 < len2) result[start++] = r[index2++];  //如果有剩余,直接将它们补在答案数组后
    delete [] l;
    delete [] r;   //释放分配的动态内存
}
void merge_sort(int *result , int start , int ended)
{
    if(ended > start)
    {
        int mid = (start + ended) >> 1;
        merge_sort(result , start , mid);
        merge_sort(result , mid+1 , ended);  //利用递归进行分冶
        mymerge(result , start , ended);       //合并数组
    }
}
int main()
{
    int test[100];
    int n;cin>>n;
    for(int i = 0 ; i < n ; i++)
        cin>>test[i];
    cout<<"before merge_sort: ";
    for(int i = 0 ; i < n ; i++)
        cout<<test[i]<<" ";
        cout<<endl;
    merge_sort(test , 0 , n-1);
    cout<<"after merge_sort: ";
    for(int i = 0 ; i < n ; i++)
        cout<<test[i]<<" ";
}

在这里插入图片描述

你可能感兴趣的:(c++)