java中归并排序算法的递归与迭代

     归并排序(merge sort)算法的思想是( 以数组为例)将一个要排序的数组分为两半,对这两半分别排序,再将它们归并为一个有序数组。这是一种采用分治法的算法,就是将一个问题分解成两个或更多个规模更小但却截然不同的问题,分别解决每个新问题,再将它们的解法组合起来解决原问题。综上所述,归并排序主要分为两个步骤:一是如何将要排序的数组进行划分;二是如何已经排好序的数组合并为原来的数组。下面是基于递归与迭代的归并排序算法的设计。

     基于递归的merge sort

     基本思路:将一个要排序的数组,按序号分成原数组的两半(为了合并的方便,要保证划分后的数组序号是连续的),对这两半分别排序,将排序后的两个数组合并为一个临时数组,最后将这个临时数组复制回原数组。(注:划分后的两个数组继续使用划分的方法进行划分,只到每个数组中只含一个元素为止)

     算法实现:

/**
	 * 这一步主要是为了隐藏临时数组
	 * @param Array
	 * @param first
	 * @param last
	 */
	public void mergeSort(T[] Array,int first,int last)
	{
		T[] tempArray=(T[])new Comparable[Array.length];
		mergeSort(Array,tempArray,first,last);
	}
	/**
	 * 归并排序
	 * @param Array  原数组
	 * @param tempArray  临时数组
	 * @param first  要排序数组的起始序号
	 * @param last   要排序数组的结束序号
	 */
	public void mergeSort(T[] Array,T[] tempArray,int first,int last)
	{
		
		if(first
        基于迭代的merge sort

       基本思路:从数组的始端开始,将每一对单个元素归并为含有两个元素的子数组,然后回到数组的始端,将每一对含有两个元素的子数组归并为含有4个元素的子数组,以此类推。注:归并两个子数组需要一个额外的临时数组,尽管使用这额外的数组的空间是必需的,但可以通过一定的技巧节省递归中消耗在将元素从临时数组复制回原数组的大部分时间。

       算法实现:

      

	/**
	 * 将Array中的子数组归并到tempArray中,不需要将tempArray复制到Array中,而是将tempArray的子数组归并到Array中
	 * @param Array
	 * @param first
	 * @param last
	 */
	public void mergetionSort(T[] Array,int first,int last)
	{
		T[] tempArray=(T[])new Comparable[Array.length];
		int step=1;
		while(step

你可能感兴趣的:(java)