一、归并排序
基本思路:利用分治法的思想,将数组分成两个数组,如果两个子数组无序,那么就继续分解,直至每组只剩一个元素,最后依次进行合并。难点在于如何将两个有序数组合并为一个。
伪代码:
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++; } }