现在的位置: 首页 > 综合 > 正文

归并排序

2018年09月29日 ⁄ 综合 ⁄ 共 906字 ⁄ 字号 评论关闭

一、归并排序

基本思路:利用分治法的思想,将数组分成两个数组,如果两个子数组无序,那么就继续分解,直至每组只剩一个元素,最后依次进行合并。难点在于如何将两个有序数组合并为一个。

伪代码:

MERGESORT(A,p,r)
   if p<r
      q=(p+r)/2
      MERGESORT(a,p,q)
      MERGESORT(a,q+1,r)
      MERGE(A,p,q,r)
MERGE(A,p,q,r)
   len1=q-p+1
   len2=r-q
   let L[0...len1-1] and R[0...len2-1] be new arrays
   for i=0 to len1-1
      L[i]=A[p+i]
   for j=- to len2-1
      R[j]=A[q+j]
   m=0
   n=0
   k=0
   while m<len1 and n<len2
       if L[m]<R[n]
          A[p+k]=L[m]
          m++
          k++
       else
          A[p+k]=R[n]
          n++
          k++
   while m<len1
       A[p+k]=L[m]
       m++
       k++
   while n<len2
       A[p+k]=R[n]
       n++
       k++

java代码:

public static void mergeSort(int A[],int p,int r){
	if(p < r){
		int q = (p+r)/2;
		mergeSort(A,p,q);
		mergeSort(A,q+1,r);
		merge(A,p,q,r);
	}
	
}
public static void merge(int A[],int p,int q,int r){
	int len1 = q-p+1;
	int len2 = r-q;
	int L[] = new int[len1];
	int R[] = new int[len2];
	for(int i = 0; i < len1; i++)
		L[i] = A[p+i];
	for(int j = 0; j < len2; j++)
		R[j] = A[q+1+j];
	int n = 0;
	int m = 0;
	int k = 0;
	while(n < len1 && m < len2){
		if(L[n] < R[m]){
			A[p+k] = L[n];
			n++;
		}else{
			A[p+k] = R[m];
			m++;
		}
		k++;
	}
	while(n < len1){
		A[p+k] = L[n];
		n++;
		k++;
	}
	while(m < len2){
		A[p+k] = R[m];
		m++;
		k++;
	}
}

【上篇】
【下篇】

抱歉!评论已关闭.