zoukankan      html  css  js  c++  java
  • 分治——合并排序

    分治策略中有一个经典的算法就是合并排序。这个算法的精髓也是分治二字。分而治之。

    将一个大规模的问题切割成若干个相同的小问题,小问题的规模非常小,非常easy解决,攻克了小的问题后再对这些小问题的结果进行合并得到大规模问题的解答。

    合并排序便是分治策略中比較经典的算法。首先是合并。两个排列有序的数列经过合并后成为有序的数组:代码例如以下:

    void _merge(int *A,int left,int middle,int right)
    {
    	int i=left,j=middle+1,k=0;
    	int *C;
    	C=new int[right-left+1];
    	while(i<middle+1 && j<right+1)
    	{
    		if(A[i]<A[j])
    		{
    			C[k++]=A[i++];
    		}
    		else
    		{
    			C[k++]=A[j++];
    		}
    	}
    	while(i<middle+1)
    		C[k++]=A[i++];
    	while(j<right+1)
    		C[k++]=A[j++];
    	for(int i=0;i<right-left+1;i++)
    	{
    		A[i+left]=C[i];
    	}
    	delete[] C;
    }
    上面的算法是将一个数组分成左右两个进行合并,假设这左右的两个数组都是排列有序的话,那么合成的新的数列也是有序的,以下的任务就是怎么将左右的两个数列排列成有序的。方法就是用递归思想。不断的递归,将数列不断的划分。划分成最小的单元,仅仅有一个数的时候,那么再进行合并,合并成的数列便是有序数列了,代码例如以下:

    void _merge_sort(int *A,int left,int right)
    {
    	
    	if(left<right)
    	{
    		int middle=(left+right)/2;
    		_merge_sort(A,left,middle);
    		_merge_sort(A,middle+1,right);
    		_merge(A,left,middle,right);
    	}
    }
    最后进行測试:

    void main()
    {
    	int ib[]={2,3,1,0,9,1,3,5};
    	int length=sizeof(ib)/sizeof(int);
    	_merge_sort(ib,0,length-1);
    	for(int i=0;i<length;i++)
    	{
    		cout<<ib[i]<<' ';
    	}
    }
    结果例如以下:





  • 相关阅读:
    UVA 10970 Big Chocolate
    HBuilder 安装uviewui2.0
    域名访问配置支持ipv6
    SSIS学习视频(SQL Server 2008)
    碰到MySQL无法启动1067错误问题
    对存储过程进行加密和解密(SQL 2008/SQL 2012)
    脚本文件比较工具WinMerge
    通过SQL绘制杨辉三角
    通用分页存储过程(SQL Server 2005)
    重新组织和重新生成索引sp_RefreshIndex
  • 原文地址:https://www.cnblogs.com/mengfanrong/p/5148413.html
Copyright © 2011-2022 走看看