zoukankan      html  css  js  c++  java
  • 二路归并排序(也叫合并排序)

    以下这图展示了二路归并的过程


    二路归并的核心代码是merge()函数

    它将2个切割的数组有序的合并在一起

    如图:

    在数组A中,

    从p到q是一个数组,从q到r是另外一个数组

    那么怎样将这2个数组有序的合并在一起,组个新的数组A呢?

    步骤:

    第一步:开辟一个数组L,存放p到q之间(也就是须要归并的左边数组)的元素

    第二部:开辟一个数组R。存放q到r之间(也就是须要归并的右边数组)的元素

    第三步:2个数组的最后还要加一个无穷大的数(能够用0x7FFF表示),因此开辟的数组空间要多1字符个空间

    第四步:L与R中的数字逐个比較,把较小的先放在数组A中(从数组A【0】開始存放。依次往后覆盖原来的数),然后较小的数组指针往后移动,指向下一位再和另外一个数组比較



    //第一个參数为须要排序的数组,第2个參数为切割的第一个数组開始元素的下标
    //第3个參数为切割的第一个数组的最后1个元素的下标
    //第4个參数为数组最后1个元素的下标
    void Merge(int *A,int p,int q,int r)
    {
    	int n1,n2,i,j,k,g;
    	n1=q-p+1;
    	n2=r-q;
    	int *L,*R;
    	L=(int *)malloc(sizeof(int)*(n1+1)); 
    	R=(int *)malloc(sizeof(int)*(n2+1));
    	L[n1]=0x7fff; //开辟的左右2个数组最后1个数设置为最大值
    	R[n2]=0x7fff;
    	g=0;
    	for(i=p;i<=q;i++)
    	{
    		L[g]=A[i];
    		g++;
    	}
    	g=0;
    	for(i=q+1;i<=r;i++)
    	{
    		R[g]=A[i];
    		g++;
    	}
    	//逐个比較左右两组数组,把较小的值写入原来的数组
    	j=k=0;
    	for(i=p;i<=r;i++)
    	{
    		if(L[j]<R[k])
    		{
    			A[i]=L[j];
    			j++;
    		}
    		else
    		{
    			A[i]=R[k];
    			k++;
    		}
    	}
    }
    

    完整代码:

    #include<iostream>
    using namespace std;
    
    //第一个參数为须要排序的数组,第2个參数为切割的第一个数组開始元素的下标
    //第3个參数为切割的第一个数组的最后1个元素的下标
    //第4个參数为数组最后1个元素的下标
    void Merge(int *A,int p,int q,int r)
    {
    	int n1,n2,i,j,k,g;
    	n1=q-p+1;
    	n2=r-q;
    	int *L,*R;
    	L=(int *)malloc(sizeof(int)*(n1+1)); 
    	R=(int *)malloc(sizeof(int)*(n2+1));
    	L[n1]=0x7fff; //开辟的左右2个数组最后1个数设置为最大值
    	R[n2]=0x7fff;
    	g=0;
    	for(i=p;i<=q;i++)
    	{
    		L[g]=A[i];
    		g++;
    	}
    	g=0;
    	for(i=q+1;i<=r;i++)
    	{
    		R[g]=A[i];
    		g++;
    	}
    	//逐个比較左右两组数组,把较小的值写入原来的数组
    	j=k=0;
    	for(i=p;i<=r;i++)
    	{
    		if(L[j]<R[k])
    		{
    			A[i]=L[j];
    			j++;
    		}
    		else
    		{
    			A[i]=R[k];
    			k++;
    		}
    	}
    }
    
    void MergeSort(int *A,int p,int r)
    {
    	int q;
    	if(p<r) //当第一个元素比最后1个元素还小时,继续运行递归,直到仅仅剩下一个元素(形參p=r)
    	{
    	q=(p+r)/2;
    	MergeSort(A,p,q);
    	MergeSort(A,q+1,r);
    	Merge(A,p,q,r);
    	}
    }
    
    void main()
    {
    	int A[5]={5,3,4,23,11};
    	MergeSort(A,0,4);
    	for(int i=0;i<5;i++)
    		cout<<A[i]<<endl;
    	system("pause");
    }




  • 相关阅读:
    AQS的子类在各个同步工具类中的使用情况
    SpringBoot RabbitMQ 延迟队列代码实现
    Java线程状态、线程start方法源码、多线程、Java线程池、如何停止一个线程
    Java内存模型,为啥线程要有自己的本地内存,CPU高速缓存
    Java内存模型中volatile关键字的作用
    Java内存模型、JVM内存结构和Java对象模型
    搞定springboot项目连接远程服务器上kafka遇到的坑以及完整的例子
    MongoDB导出与导入远程Linux服务器上的数据
    DeferredResult使用方式和场景
    【IT笔试面试题整理】二叉树中和为某一值的路径--从根到叶子节点
  • 原文地址:https://www.cnblogs.com/bhlsheji/p/5090634.html
Copyright © 2011-2022 走看看