合并排序

原创
2013/09/13 19:07
阅读数 26

合并排序采用分治的模式,分治模式在每一层递归上都有3个步骤:

1、分解(Divide):将原问题分解成一系列的子问题。

2、解决(Conquer):递归第解决子问题。

3、合并(Combine):将子问题的结果合并成原问题的解。

合并排序完全按照上面的模式,直观的操作如下:

分解:将n个元素分成n/2个元素的子问题。

解决:用合并排序对两个子序列递归的排序。

合并:合并两个已经排序的子序列得到排序的结果。

用java实现的合并排序代码如下:

import java.util.Arrays;

public class MergeSortTest {
	
	public static void main(String[] args) {
		int a[] = {100,2,9,6,3,4,7,45,11,1,8};
		merge_sort(a,0,a.length-1);
		System.out.println(Arrays.toString(a));
	}
	
	public static void merge_sort(int a[],int p, int r){
		if(p<r){
			//分解
			int q = (p+r)/2;
			merge_sort(a,p,q);
			merge_sort(a,q+1,r);
			//合并
			merge(a,p,q,r);
		}
	}
	
	//合并两个已经排好序的数组到目标数组a中
	public static void merge(int []a,int p,int q,int r)
	{
		int n1 = q-p+1;
		int n2 = r-q;
		int L[] = new int[n1];
		int R[] = new int[n2];
		int i,j,k;
		for(i=0; i<n1; i++)
		{
			L[i] = a[p+i];
		}

		for (j=0; j<n2; j++) 
		{
			R[j] = a[q+j+1]; 
		}

		i = 0;
		j = 0;

		for (k=p; k<=r;k++) 
		{
			
			if (L[i]>=R[j]) {
				a[k] = L[i];
				i++;
				//如果L数组中的所有元素全部被复制到a中了,就把R数组中剩下的元素全部复制到a数组中
				if(i==n1){
					k++;
					for (;  j< R.length; j++) {
						a[k++] = R[j];
					}
					break;
				}
			}else{
				a[k] = R[j];
				j++;
				//如果R数组中的所有元素全部被复制到a中了,就把L数组中剩下的元素全部复制到a数组中
				if(j==n2){
					k++;
					for (;  i< L.length; i++) {
						a[k++] = L[i];
					}
					break;
				}
			}
			
		}
	}

}
结果:

[100, 45, 11, 9, 8, 7, 6, 4, 3, 2, 1]


展开阅读全文
打赏
0
0 收藏
分享
加载中
更多评论
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部