将区间不断二等分,二等分…
然后一个接一个合并
假设merge_sort(int a[],int l,int r)
为 此次划分的区间为l到r,如何继续划分以及排序的问题
代码如下:
int a[N],temp[N];
void merge_sort(int a[],int l,int r){
if(l>=r) return ;
int mid=l+r>>1;
// 划分区间,使得l到mid有序,mid+1到r有序
merge_sort(a,l,mid);
merge_sort(a,mid+1,r);
//现在考虑区间合并问题
int k=0,i=l,j=mid+1;
while(i<=mid&&j<=r)
if(a[i]<=a[j]) temp[k++]=a[i++];
else temp[k++]=a[j++];
while(i<=mid) temp[k++]=a[i++];
while(j<=r) temp[k++]=a[j++];
for(i=l,j=0;i<=r;i++,j++) a[i]=temp[j];
}
Java代码实现:
static privatevoid mergeSort(T[] arr, int l, int r, Comparator comparator,Object[] temp) { if (l >= r) return; int mid = l + r >> 1; mergeSort(arr, l, mid, comparator,temp); mergeSort(arr, mid + 1, r, comparator,temp); int k = 0, i = l, j = mid + 1; while (i <= mid && j <= r) if (comparator.compare(arr[i], arr[j]) <= 0) temp[k++] = arr[i++]; else temp[k++] = arr[j++]; while (i <= mid) temp[k++] = arr[i++]; while (j <= r) temp[k++] = arr[j++]; for (i = l, j = 0; i <= r; i++, j++) arr[i] = (T) temp[j]; }



