【排序算法】归并排序(再记不住我就去死)

归并排序(归,递归;并,合并;可以理解为这两个过程)

 

 平均时间复杂度最好情况最坏情况空间复杂度
归并排序O(log₂n)O(log₂n)O(log₂n)O(1)

 

算法思想:先将整个序列分为两半,对每一半分别进行归并排序,将得到两个有序序列,然后将这两个序列归并成一个序列即可。

/**
 *归并排序:归并分开看,既有归(递归)又有并(合并)。
 *Author:Mr.Wang
 */
 public class MergeSort{
	 /**
	  * 递归过程
	  * @param arr
	  * @param low
	  * @param high
	  */
	 public static void sort(int []arr,int low,int high){
		 if(low<high)
		 {
			 int mid=(low+high)/2;
			 sort(arr,low,mid);
			 sort(arr,mid+1,high);
			 merge(arr,low,mid,high);
		 }
	 }
	 /**
	  * 合并过程
	  * @param arr数组
	  * @param left
	  * @param mid
	  * @param right
	  */
	 private static void merge(int[] arr, int left, int mid, int right) {
	        int[] temp = new int[right - left + 1];
	        int i = left;
	        int j = mid+1;
	        int k = 0;
	        while(i<=mid&&j<=right){
	            if (arr[i] < arr[j]) {
	                temp[k++] = arr[i++];
	            } else {
	                temp[k++] = arr[j++];
	            }
	        }
	        while(i<=mid){//将左边剩余元素填充进temp中
	            temp[k++] = arr[i++];
	        }
	        while(j<=right){//将右序列剩余元素填充进temp中
	            temp[k++] = arr[j++];
	        }
	        //此处不可想当然的认为只需将temp的地址值赋给arr就可以
	        //而且必须得一一对应,故采用了for循环。
	        //将temp中的元素全部拷贝到原数组中
	        for (int k2 = 0; k2 < temp.length; k2++) {
	            arr[k2 + left] = temp[k2];
	        }
	 }
	 public static void main(String []args){
		 int []arr={5,6,2,7,12,4,9,11};
		 sort(arr,0,arr.length-1);
		 for(int i=0;i<arr.length;i++)
		 {
			 System.out.print(arr[i]+",");
		 }
	 } 
 }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值