归并排序--java(递归)

       归并排序是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并

      排序方法:将一个大的序列分成两个小的子序列,分别对其进行排序,每个小的子序列再分为两个子序列,一直下去,到最后两个子序列只有一个元素,我们认为每个子序列都是有序的(因为只有一个元素)。得到了两个有序的子序列后在将两个有序的子序列合并成一个有序的序列,如此递归最终实现排序。

      将两个有序的子序列合并成一个大的有序序列:创建临时数组保存合并后的大序列。因为每个子序列都是有序的,设子序列分别为a,b,临时的数组为c。

为ab分别分配两个指针i,j,数组c的指针为k,则代码如下:

	while(i < a.length && j < b.length ){
		if(a[i] > b[j])
			c[k++] = b[j++];
		else
			c[k++] = a[i++];
	}
	while(i < a.length)
		c[k++] = a[i++];
	while(j < b.length)
		c[k++] = b[j++];

下面给出归并排序的java算法:

	public static void Merge(int[] array, int low, int high) {
	    if(low >= high)
	    	return;
	    int mid = (low + high)/ 2;
	    Merge(array, low, mid);
	    Merge(array, mid + 1, high);
	    merge(array, low, mid, high);          //注意,这行是调用merge,而不是Merge,不要弄混了
	}
	public static void merge(int[] array, int low, int mid, int high) {
		int[] temp = new int[high - low + 1]; //创建临时数组保存有序数列
		int i = low;
		int j = mid + 1;
		int k = 0; //temp数组的下标
		while(i <= mid && j <= high){
			if(array[i] > array[j])
				temp[k++] = array[j++];
			else
				temp[k++] = array[i++];
		}
		while(i <= mid)
			temp[k++] = array[i++];
		while(j <= high)
			temp[k++] = array[j++];
		for(k = 0; k < temp.length; k++)
			array[low++] = temp[k];
	}

输入:
8,9,7,5,4,6,32,1,5,65,0,4,3

输出:0 1 3 4 4 5 5 6 7 8 9 32 65

算法时间复杂度:O(nlogn),空间复杂度为 O(n),比较操作的次数介于(nlogn) / 2和nlogn - n + 1。归并排序比较占用内存,但却效率高且稳定的算法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值