归并排序(Java)

  文章参考了博文“白话经典算法”(http://blog.csdn.net/morewindows/article/details/6678165/)。

  归并是把两个已排序文件合并成一个更大的已排序文件的过程,而相比之下,选择是把一个文件分成包含k个最小元素和n-k个最大元素两部分的过程。归并排序适用于链表排序。

  算法的主体部分如下,通过递归,将原序列分化成子序列:

	void MergeSort(int A[], int temp[], int left, int right){
		int mid;
		if(right>left){
			mid = (right+left)/2;
			MergeSort(A,temp,left,mid);
			MergeSort(A,temp,mid+1,right);
			Merge(A,temp,left,mid+1,right);
		}
	}

  算法的合并部分如下,注意的是left-mid-1和mid-right都是已经排好序的:

	 void Merge(int[] A, int[] temp, int left, int mid, int right) {
		// TODO Auto-generated method stub
		int i, left_end, size, temp_pos;
		left_end = mid-1;
		temp_pos = left;
		size = right-left+1;
		while( (left<=left_end) && (mid<=right) ){
			if(A[left] <= A[mid]){
				temp[temp_pos] = A[left];
				temp_pos = temp_pos+1;
				left = left+1;
			}
			else{
				temp[temp_pos] = A[mid];
				temp_pos = temp_pos + 1;
				mid = mid + 1;
			}//else
		}
		while(left <= left_end){
			temp[temp_pos] = A[left];
			left = left + 1;
			temp_pos = temp_pos + 1;
		}
		while(mid <= right){
			temp[temp_pos] = A[mid];
			mid = mid + 1;
			temp_pos = temp_pos + 1;
		}
		for(i=0;i<size;i++){
			A[right] = temp[right];
			right = right-1;
		}
	}
  测试代码如下:

	 public static void main(String[] args) {
		int[]A = {12,23,34,2,34,66,15};
		int[] temp = new int[A.length];
		MergeSort(A,temp,0,A.length-1);
		for(int i=0;i<A.length;i++)
			System.out.println(A[i]);
	}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值