归并排序法详解

1.归并排序法的思想及分段代码

           归并排序法顾名思义是一种排序的算法,它是分而治之(divide-and-conquer)这种思想的典型体现。从名字上我们可以很清楚的知道这是一种通过归并实现数列有序的算法。算法图解如下:


       那么什么是归并呢?归并从数列的操作上可以表示为:首先将一个需要排序的数列进行二分操作,接着对二分后的数列接着进行二分,直到每一个元素作为一个子序列,这体现了分而治之的“分”字诀。然后对相邻的两个子序列进行排序,排序完成后再对它二分前的子序列进行排序,以此类推,一步一步的完成整个排序工作。数列分割的代码如下:

void mergesort(int first,int last )//对已知数组进行分解
{
    int middle;
    if(first<last)
	{
	    middle=(first+last)/2;
	    mergesort(first,middle);//左边分解
	    mergesort(middle+1,last);//右边分解
	    merge_sort(a,first,middle,last);//排序合并数组
	}
}

       排序的具体思想是:将有序数列a[i]~a[j]的第一个元素a[i]和有序数列a[j+1]~a[k]的第一个元素a[j+1]进行大小比较,将较小的元素输入到b[m](int m=i),将剩下的两个数列的首元比较大小,小的储存到b[m+1]中,以此类推直到一个数列的元素安全储存到数列b中,再将剩下的那个有序数列依次储存到b中。这就体现了分而治之的“治”字诀。数列排序的代码如下:

void merge_sort(int b[ ],int first,int middle,int last)
{
   int temp[num];
   int i,j,k;
   i=first;
   k=first;
   j=middle+1;
   while(i<=middle&&j<=last)
   {
       if(b[i]<=b[j]) temp[k++]=b[i++];
       else temp[k++]=b[j++];
   }
   while(i<=middle)
   {
       temp[k++]=b[i++];
   }
   while(j<=last)
   {
      temp[k++]=b[j++];
   }
   for(int i=first;i<=last;i++)
   {
       a[i]=temp[i];
   }

}
2.整个代码如下

#include<iostream>
using namespace std;

/**************************归并排序******************************/
const static int num=9;//数组的维数
static int * a;


void merge_sort(int b[ ],int first,int middle,int last)
{
   int temp[num];
   int i,j,k;
   i=first;
   k=first;
   j=middle+1;
   while(i<=middle&&j<=last)
   {
	if(b[i]<=b[j]) temp[k++]=b[i++];
	else temp[k++]=b[j++];
   }
   while(i<=middle)
   {
       temp[k++]=b[i++];
   }
   while(j<=last)
   {
      temp[k++]=b[j++];
   }
   for(int i=first;i<=last;i++)
   {
       a[i]=temp [i];
   }

}
void mergesort(int first,int last )//对已知数组进行分解
{
    int middle;
    if(first<last)
	{
	    middle=(first+last)/2;
	    mergesort(first,middle);//左边分解
	    mergesort(middle+1,last);//右边分解
	    merge_sort(a,first,middle,last);//排序合并数组
	}
}
int main()
{
   a=new int[num];
   for(int i=0;i<num;i++)
   {
       cin>>a[i];
   }
   mergesort(0,num-1);
   for(int i=0;i<num;i++)
   {
        cout<<a[i]<<" ";
   }
   system("pause");
   return 0;
}
     这就是整个程序的代码,只要能理解归并的思想,同时将递归加入到程序中,编出这个代码就会变得so easy!

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值