归并排序

   归并排序是八大排序算法之一,它的空间复杂度为O{n*logn},他比基础的冒泡排序和选择排序要快。

  归并排序是利用了递归,把一个数组分为两半,然后分别排序,然后再整体排序,可能我直接这样说你不太理解,我利用图来分析一下。

   首先将数组一分为二(分为左半部分和右半部分):

 然后将左半部分和右半部分排好序后,分别用两个指针来进行比较:

这里是这么进行比较的:开辟一个新的数组,然后把第一指针指向的数组和第二个指针指向的数组进行比较,把小的一个数存进这个新的数组,然后对应的指针后移一个单位,这里就是把1存进新数组,然后指针后移指向6,然后再把6跟3比较,3比6小,然后把三存进数组,指针后移,后面依次, 然后那个指针优先到达末尾的话,另一个指针后面的数直接依次copy进新数组就可以了。

    说起来简单,可是要实现起来很难,当时我听别人讲起来感觉容易理解,但是直接拿着代码研究了很久。

public class Guibin {
	public static void main(String[] args) {
		int[] a = {9, 4, 32, 6, 9};
		 sort(a, 0, 4);
		
		for(int i = 0; i < a.length; i++){
			System.out.print(a[i]+" ");
		}
	}

 

public static void sort(int[] arr, int L, int R){
		if(L == R){
			return ;
		}
		int mid = L+((R-L)>>1);
		sort(arr, L, mid);
		sort(arr, mid+1, R);
		merg(arr, L, mid, R);
	}

private static void merg(int[] arr, int l, int mid, int r) {
		int[] help = new int[r-l+1];
		int P1 = l;
		int i = 0;
		int P2 = mid+1;
		while(P1 <= mid && P2 <= r){
			if(arr[P1] < arr[P2]){
				help[i++] = arr[P1++];
			}else{
				help[i++] = arr[P2++];
			}
		}
		while(P1 <= mid){
			help[i++] = arr[P1++];
		}
		
		while(P2 <= r){
			help[i++] = arr[P2++];
		}
		
		for(i = 0; i < help.length; i++){
			arr[l+i] = help[i];
		}
	}

这就是归并排序的具体实现,这里我的代码并不完善,没有去判断和处理一些特殊情况,建议大家编程的时候不要忽略。

这里面的 int mid = L+((R-L)>>1); 这一句代码相当于 int mid = L + (R - L)/2;这样写是为了防止溢出。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值