排序算法之归并排序


title: 排序算法之归并排序
date: 2019-09-09 16:50:54
tags: -归并排序

算法思想
  1. 首先,将两个有序数组进行合并排序是很容易的,及比较两个数组的第一个元素。小的从数组中取出,并放到一个临时数组中,重复上述操作,直到一个数组中的元素已经被取完。然后直接将剩余数组的元素直接放到临时数组后。

  2. 代码如下

    	private static void Merge_array(int[] a,int n,int[] b,int m,int[] temp)
    	{
    		int i,j,k=0;
    		while(i<=n && j<=m)
    		{
    			if(array[i]<array[j])
    			{
    				temp[k++] = array[i++];
    			}
    			else
    			{
    				temp[k++] = array[j++];
    			}
    		}
    		
    		while(i<=n)
    		{
    			temp[k++] = array[i++];
    		}
    		
    		while(j<=m)
    		{
    			temp[k++] = array[j++];
    		}
    		
    	}
    
  3. 在上述思想的基础上,就产生了归并排序。但是上述代码的前提是要求两个待排序的数组有序。

    若现在有一个待排序的数组,我们将其进行分割,若最后分割成每一块只有一个元素,就可以看成一个有序的数组(一个数组就只有其一个元素,肯定是有序的)。对这些只有一个元素的数组进行两两排序(此时就保证了是两个有序数组进行合并排序)。

  4. 在分割待排序数组的时候用到了递归的方法。

    以本题举例分割时主要递归执行Merge_sort()函数。执行过程如下:

    first和last的取值依次是(0,9)(0,4)(0,2)(0,1)(0,0),由于这个过程中直到(0,0)才使first<last不成立。于是退到(0,1),该执行Merge_sort(array,mid+1,last,temp),此时mid+1=1 ,last=1,不满足first<last,于是执行

    Merge_adjoin_array(array,temp,first,mid,last),这次排序排的是array[0]和array[1],执行完退到(0,2),执行Merge_sort(array,mid+1,last,temp),mid+1=2,last=2,不满足first<last,然后执行Merge_adjoin_array(array,temp,first,mid,last),将a[0-1]数组和a[2]进行排序,因为a[0-1]已经是有序的了,此时得到有序数组a[0-2]。然后退回到(0,4),执行Merge_sort(array,mid+1,last,temp),此时mid+1=3,last=4,满足first<last,得到mid=(first+last)/2=3,执行Merge_sort(array,first,mid,temp),first=3 mid=3,不满足first<last,则回退执行Merge_sort(array,mid+1,last,temp),mid+1=4,last=4,也不满足first<last,则回退执行Merge_adjoin_array(array,temp,first,mid,last),使a[3]和a[4]两个有序数组合并排序成a[3-4],在执行(0,4)中的Merge_adjoin_array(array,temp,first,mid,last),使a[0-2]和a[3-4]两个有序数组进行合并有序排列。以后类推。

    package merge;
    import Select.NewArray;
    public class Merge_sort {
    
    	public static void main(String[] args) {
    		NewArray array = new NewArray();//这样就随机生成了一个有十个成员的数组
    		int[] a = array.Array();
    		System.out.println("初始状态");
    		Display(a);
    		int[] temp = new int[10];
    		Merge_sort(a,0,9,temp);
    		Display(a);
    
    	}
    	
    	private static void Merge_adjoin_array(int[] array,int[] temp,int first,int mid,int last)
    	{
    		int i = first,j = mid+1;
    		int m = mid,n = last,k =0 ;
    		while(i<=m && j<=n)
    		{
    			if(array[i]<array[j])
    			{
    				temp[k++] = array[i++];
    			}
    			else
    			{
    				temp[k++] = array[j++];
    			}
    		}
    		
    		while(i<=m)
    		{
    			temp[k++] = array[i++];
    		}
    		
    		while(j<=n)
    		{
    			temp[k++] = array[j++];
    		}
    		
    		for(i=0;i<k;i++)
    		{
    			array[first+i] = temp[i];
    		}
    	}
    	
    	private static void Merge_sort(int[] array,int first,int last,int[] temp)
    	{
    		if(first<last)
    		{
    			int mid = (first+last)/2;
    			Merge_sort(array,first,mid,temp);
    			Merge_sort(array,mid+1,last,temp);
    			Merge_adjoin_array(array,temp,first,mid,last);
    		}
    	}
    	
    	private static void Display(int[] array)
    	{
    		for(int i = 0;i<array.length;i++)
    		{
    			System.out.print(array[i]);
    			System.out.print(" ");
    		}
    		System.out.println();
    	}
    
    }
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值