【排序算法】归并排序(java实现)

1.基本思想:

归并排序指的是将两个已经排序的序列合并成一个序列的操作。主要分为两种,分别是自顶向下的排序方式和自底向上的排序方式。

对于自顶向下的排序算法:

采用分治法进行自顶向下的程序设计方式,分治法的核心思想就是分解、求解、合并

(1)将长度为N的无序序列平均分割成两个子序列

(2)对这两个子序列分别进行归并排序

(3)将排序好的两个子序列进行归并排序



对于自底向上的排序算法:

第1 趟归并排序,将这含有N个元素的无序序列看成N个长度为1 的有序序列,两两归并。如果是偶数个子序列,则得到长度为N/2 的子序列;如果是奇数个,则最后一个轮空,得到(n-1)/2 +1 个子序列

第2趟归并排序,第1趟归并所得到的有序的子序列两两归并。

如此反复,直至得到一个长度为n的有序序列为止。


2.算法分析:

时间复杂度:O(nlog2n)

空间复杂度 : O(n)

稳定性:稳定

3.算法实现:

3.1自顶向下:

//归并排序	自顶向下
	public static void Merge(int[] array,int start ,int mid,int end){
		int i=start,j=mid+1,l=0;
		int[] total = new int[end - start+1];
		
		while(i <= mid && j <= end){
			if(array[i] <array[j]){
				total[l++] = array[i++];
			}else{
				total[l++] = array[j++];
			}
		}
		while(i <= mid)
			total[l++] =array[i++] ;
		while(j <= end)
			total[l++] =array[j++] ;
		for(i = 0; i < l; i++){
			array[start + i] = total[i];
		}
	}
	public static void MergeSort(int[] array,int start,int end){
		if(start < end){
			int mid =(start + end)/2;
			//int mid = (start & end) + (start ^ end)>>1;
			MergeSort(array,start,mid);
			MergeSort(array,mid+1,end);
			Merge(array,start,mid,end);
		}
	}

3.2自底向上:
//自底向上
	public static void MergeGroup(int[] array,int len, int sub_len){
		int new_sublen = sub_len*2;
		int i;
		for(i = 0; i + new_sublen - 1 < len; i += new_sublen){
			Merge(array,i,i+sub_len-1,i+new_sublen-1);
		}
		//进行最后一次归并
		if (i == 0) Merge(array,i,i+sub_len-1,len-1);
	}
	
	public static void MergeSort2(int[] array){
		int len = array.length ;
		if (len <= 0) return;
		for (int n =1; n < len; n*=2){
			MergeGroup(array,len,n);
		}
				
	}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值