归并排序
将区间不断二等分,二等分…
然后一个接一个合并
假设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 private <T> void mergeSort(T[] arr, int l, int r, Comparator<T> 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];
}