Java排序算法6:归并排序

一.思想:

将两个或者两个以上的有序表合并成一个新的有序表。设定两个指针,最初位置分别为两个已经排序序列的起始位置,然后比较两个指针所指向的元素,选择相对小的放入合并空间,并移动指针到下一位置,之后重复上述的步骤,直到达到某一序列的序列尾,最后将另一个序列的剩余所有元素直接复制到合并序列尾部。

二.例子:

比如5,4,6,2,3,1,首先找出中间索引,center=(left+right)/2=(0+5)/2=2;进行分组直到left>=right则分组停止

1.进行分组(left,center)为一组,(center+1,right)为一组,所以{5,4,6}为一组,{2,3,1}为一组。

2.再进行分组,对于{5,4,6},center=(0+2)/2=1,所以分为{5},{4,6},对于{2,3,1}同理分为{2},{3,1}.

3.然后进行归并排序,对{5}{4,6}进行归并排序,用两个指针的形式,归并后为{4,5,6},同理,对{2},{3,1}进行归并排序,排序后为{1,2,3}.

4.再对{4,5,6}{1,2,3}进行归并排序,归并后为{1,2,3,4,5,6}

三.代码实现:

public class MergeSort {
	public static void main(String args[])
	{
		int num[] = {4,3,6,9887,5,3,2,3,1};

		System.out.print("原始数据:");
		print(num);		
		
		mergesort(num,0,8);
		
		System.out.print("排序后数据:");
		print(num);
	}
	
	public static void mergesort(int num[],int left,int right)
	{
		int center;
		
		if(left >= right)
			;
		else
		{
			center = (left + right) / 2;
			
			mergesort(num,left,center);
			mergesort(num,center + 1,right);
			
			merge(num,left,center,right);
		}
	}
	
	public static void merge(int num[],int left,int center,int right)
	{
		int temp[] = new int[num.length];
		
		int lindex = left;
		int rindex = center + 1;
		int tempindex = left;

		
		while( (lindex <= center) && (rindex <= right) )
		{
			if(num[lindex] <= num[rindex])
			{
				temp[tempindex++] = num[lindex++];
			}
			else
			{
				temp[tempindex++] = num[rindex++];
			}
		}
		
		while (rindex <= right)
		{
			temp[tempindex++] = num[rindex++];  
		}  
	    while (lindex <= center) 
	    {
	    	temp[tempindex++] = num[lindex++];
	    }
	    while (left <= right) 
	    {  
            num[left] = temp[left++];  
        } 
		
	}
	
	public static void print(int num[])
	{
		int i;
		
		for(i = 0; i < num.length; ++i)
		{
			System.out.print(num[i]+" ");
		}
		System.out.print("\n");
	}
}

四.复杂度与应用:

时间复杂度:O(nlogn)    空间复杂度:O(n)   是稳定的排序法

五.参考资料:

1.追竹的博客:http://blog.csdn.net/apei830/article/details/6591632

2.百度百科-归并排序:http://baike.baidu.com/view/90797.htm?fromId=19000&fr=wordsearch

六:相关排序代码下载:
包含(冒泡排序,桶排序,堆排序,插入排序,归并排序,快速排序,基数排序,选择排序,希尔排序)
免积分下载地址: http://download.csdn.net/detail/u014077165/7185895
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值