大话算法之归并排序

归并排序的核心思想是分治法,将一个需要排序的数组分成很多个部分,使每一部分分别有序之后再合并两部分,最后整个数组就会是一个有序的数组。

算法设计采用两部分解决,一部分将数组分成两部分,递归直到子数组只有一个元素,另一部分负责合并两个子数组,从两个子数组第一个元素开始遍历,选取小的一个作为合并好的数组的第一个,第二次比较被选取了元素的数组的第二个元素和另一个数组的第一个元素,以此类推,直到两个子数组都被遍历完,这样,得到的数组就是将两个子数组排好序的数组。

实现代码如下:

public class MergeSort {
	
	/**
	 * 将两个有序的数组合并为一个有序的数组
	 * @param arr
	 * @param begin
	 * @param middle
	 * @param end
	 */
	public void sort(int[] arr, int begin, int middle, int end){
		int[] temp = new int[end-begin+1];
		int first = begin;
		int second = middle+1;
		int k = 0;
		
		while(first<=middle&&second<=end){   //如果两部分都还没遍历完
			if(arr[first]<=arr[second]){
				temp[k++] = arr[first++];
			}else{
				temp[k++] = arr[second++];
			}
		}
		
		while(first<=middle){                //后半部分遍历完
			temp[k++] = arr[first++];
		}
		
		while(second<=end){                  //前半部分遍历完
			temp[k++] = arr[second++]; 
		}
		
		for(int i=0;i<k;i++){                //将排好序的部分放回原数组相应位置
			arr[i+begin] = temp[i];
		}
	}
	
	/**
	 * 将数组分为两个部分,并使其分别有序,最后再合并为一个有序的数组
	 * @param arr 需要排序的数组
	 * @param begin 第一个元素下标  
	 * @param end 最后一个元素下标
	 */
	public void merge(int[] arr, int begin, int end){
		if(begin<end){
			int middle = (begin+end)/2;
			merge(arr, begin, middle);
			merge(arr, middle+1, end);
			sort(arr, begin, middle, end);
		}
	}
	
}


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值