算法入门学习----2.1归并排序

一、归并排序的原理

 对数组采用了“分治思想”


      1.1 分:先通过二分法将数组分为一个一个单独的数。

 分的算法实现(递归):

传入参数为

数组(arr)、指向数组最左边的指针(left)、指向数组最右边的指针(right)、

空数组(temp)(长度与原数组一样,用在这里是方便将第一步也归入递归步骤)

实现内容

当传入的right>left,说明数组可以再细分,于是取两者的平均数(mid)。

这时将数组分为两组:一组是left到mid,另一组是mid+1到right,这两组依次调用递归方法,直到right<=left。

1.2 治(思路和分的思路相反):

第一次,每两个数分为一组,并排序好。

第二次,将第一步中的每两组和并成为一组,并排序好。

扫描二维码关注公众号,回复: 1810166 查看本文章

第三次,将第二步中的每两组和并成为一组,并排序好。

  ...........................

治的算法实现:

传入参数

原数组(arr)、要合并的两个数组的左指针(left)、要合并的两个数组的右指针(right)、

要合并的两个数组的中指针(mid)、空数组(temp)。

注:上述的两个数组,在分的思路中,本来是属于同一个数组,后面才分开:

所以左指针为第一个数组的最左,mid指针为第一个数组的最右;

右指针为第二个数组的最右,mid+1指针为第二个数组的最左。

实现内容

先拿第一个数组第一个数(left)第二个数组第一个数(mid+1)比较

如果第一个数组的数大于(小于)第二个数组的数,那么将第二(一)个数组的数放入新数组(temp)的第一位。

接着第二(一)个数组的指针右移一位,再次进行上述比较。

当出现某一个数组比较完的时候,将另一个数组剩下的数全部加到temp中。

   最后将比较好的数组传递给原来的数组(arr)

二、归并排序的空间复杂度和时间复杂度

本人不才:直接借鉴一下其他人的解法  :http://blog.csdn.net/yuzhihui_no1/article/details/44223225


三、归并排序的代码实现Java

public class GuiBing {
	public static void main(String[] args){  
        int[] arr=new int[]{23,5,15,37,59,45,2,156,32,48}; 
        int[] temp = new int[arr.length];//注意:Int[] temp =arr  这样的话,是将temp指向了arr所指向的数组,当temp改变的时候,arr也会改变
        sort(arr,0,arr.length-1,temp); 
        show(arr);
    }  
    public static void show(int[] arr){  //输出函数  
        for(int a: arr){  
            System.out.println(a);  
        }  
    }  
    public static void sort(int[] arr,int left,int right,int[] temp){
    	if(left<right){
    		int mid=(left+right)/2;
    		sort(arr,left,mid,temp);               //分解
    		sort(arr,mid+1,right,temp);            //分解
    		jiehe(arr,left,mid,right,temp);	       //合并
    	  }
    	}
   public static void jiehe(int[] arr,int left,int mid,int right,int[] temp){    //mid作为两边数组的临界标签
    		int right_left = mid+1;                    //存储右数组的最左边指针,用于移动
    		int left_left = left;
    		int i=0;				//存储数组的第一位
    		while(left_left<=mid && right_left<=right){   //两边数组同时遍历,依次将小的数存入temp数组
    			if(arr[left_left]<arr[right_left])      
    				temp[i++]=arr[left_left++];   			
    			else if(arr[left_left]>arr[right_left])
    				temp[i++]=arr[right_left++];  			
    		}
    		while(right_left<=right){
        			temp[i++]=arr[right_left++];
        	}	
    		while(left_left <=mid){
    			temp[i++]=arr[left_left++]; 
    		}    	
    		i=0;
    		 while(left <= right){                               //遍历,将temp改动的数组复制到arr中
    	            arr[left++] = temp[i++];
    	     }                               
    	}
}

四、参考借鉴文章

https://www.cnblogs.com/chengxiao/p/6194356.html

http://blog.csdn.net/yuzhihui_no1/article/details/44223225

猜你喜欢

转载自blog.csdn.net/kunfd/article/details/79191907