归并排序

          归并排序是建立在归并操作上的一种有效的排序算法,该算法是采用分治法的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序


如图先排粉色试它们之间有序后(粉色自身就是有序的),在它们有序后,再对绿色进行排序,然后有序后再队蓝色进行排序

public static void mergeSort(int[] array){
		for(int i = 1;i < array.length;i = i*2){
			merge(array,i);//分为1,2,4,6,8...进行排序合并
		}
	}
	private static void merge(int[] array, int gap) {
		// TODO Auto-generated method stub
		int start1 = 0;//第一组的起始位置
		int end1 = start1+gap-1;//第一组的结束位置
		int start2 = end1+1;//第二组的起始位置
		int end2 = start2+gap-1 < array.length-1 ? start2+gap-1 : array.length-1;//第二组的结束位置
		int k = 0;
		int[] tmpArr = new int[array.length];//用来存放排序过的元素
		while(start2 < array.length){//将两组进行排序
			while(start1 <= end1 && start2 <= end2){//
				if(array[start1] < array[start2]){
					tmpArr[k++] = array[start1++];
				}else{
					tmpArr[k++] = array[start2++];
				}
				
			}
			while(start1 <= end1){
				tmpArr[k++] = array[start1++];
			}
			while(start2 <= end2){
				tmpArr[k++] = array[start2++];
			}
			//往后移,对另外两组进行排序
			start1 = end2+1;
			end1 = start1+gap-1;
			start2 = end1+1;
			end2 = start2+gap-1 < array.length-1 ? start2+gap-1 : array.length-1;
			
		}
		//当最后只有一组的时候
		while(start1 < array.length){
			tmpArr[k++] = array[start1++];
		}
		for(int j = 0;j < array.length;j++){
			array[j] = tmpArr[j];
		}
	}

        

            

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值