归并排序Java实现

归并排序的主题思想:

两组有序的数据列表,要合并成一组排好序的数据列表,方法是循环每次分别用两组数据最小的数据进行比较,取较小者,即为当前合并后最小的数据项,最后将其中一个数据列表剩余数据项直接copy到合并后的数据表表尾部。

OK,现在有一组数据,使用归并排序的思想进行排序,对数据不断的进行折半拆分递归,最后拆成最原子粒度级别的数据列表只有一项数据,两个数据列表分别只有一项数据,进行合并排序成一个有两项数据的数据列表,再进行两个数据列表分别只有两项数据进行合并排序,合并成四项。。以此类推!

时间复杂度:

由完全二叉树的深度计算可知,要递归log2N次,每次递归子列表的数据全需要扫描一次,一趟归并需要将待排序序列中的所有记录扫描一遍(实际上是1...n =(1+n)/2) ,时间复杂度为:Nlog2N

 

 

public class MergeSort {
	
	public static void main(String[] args)
	{
		int a[]={1,3,0,5,6};
		MergeSort ms=new MergeSort();
		ms.sort (a,0,4);
		
		for (int i=0;i<a.length;i++)
			System.out.println(a[i]);
	}
	
	public void sort(int a[],int low,int high)
	{
	 if (low<high)
	 {
	 int mid=(low+high)/2;
	 
	 sort(a,low,mid);
	 sort(a,mid+1,high);
	 mergesort(a,low,high,mid);
	 
	 
	 }


	}
	
	public void mergesort(int a[],int low,int high,int mid)
	{

	int c[]=new int [a.length];
	int lowtemp=low;
	int midtemp=mid+1;

	int tempadr=low;
	int tmp=low;

	while (lowtemp<=mid&&midtemp<=high)
	{
	if (a[lowtemp]<=a[midtemp])
	 c[tempadr++]=a[lowtemp++];
	 else 
	 c[tempadr++]=a[midtemp++];

	}

	while (midtemp<=high)
	 c[tempadr++]=a[midtemp++];
	 
	 while(lowtemp<=mid)
	 c[tempadr++]=a[lowtemp++];
	 
	 for (int i=low;i<=high;i++)
	 a[i]=c[i];
	
	 System.out.println(Arrays.toString(a));
	 

	}

	
	

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值