merge sort
归并排序的总体思想:
● 先把序列分成两个部分,对每个部分先排序。
● 对已经分别有序的两个序列,进行合并。
合并:
- 对于要合并的数组 a[]; 先把数组a[] 中的内容
复制
到辅助数组 aux[]
中。- 两个指针i、j 分别指向aux[]中两个有序序列的首元素。
- 从i、j所指的元素中选择小的元素存回数组a[]中;同时更新i、j指针。
- 如果i、j中有指针已经指向了改有序序列的末尾,那么后面就直接复制另一个未结束的序列到a[]中。
排序:
以上归并中,有个前提条件:两个已经有序的子序列
;那么这两个有序的子序列是如何得到的呢?
这其实就用到了递归的思想。
代码:
package mergesort;
public class MergeSort {
public static void main(String[] args) {
int a [] = {45,23,11,89,77,98,4,28,65,43};
sort(a);
for(int ele : a) {
System.out.println(ele);
}
}
// 合并
private static void merge(int a[], int aux[], int lo, int mid, int hi) {
for(int k=lo; k<=hi; k++) {
aux[k] = a[k];
}
int i = lo;
int j = mid+1;
for(int k = lo; k<=hi; k++) {
if(i>mid) {a[k] = aux[j++];}
else if(j>hi) {a[k] = aux[i++];}
else if(aux[j] < aux[i]) {a[k] = aux[j++];}
else a[k] = aux[i++];
}
}
private static void sort(int a[], int aux[], int lo, int hi) {
if(hi<=lo) return; // 如果只有一个元素需要排序,则停止递归。(递归终止条件)
int mid = lo + (hi-lo)/2; // 把数组分成两个部分
sort(a, aux, lo, mid); // 对第一个部分进行排序
sort(a, aux, mid+1, hi); // 对第二个部分进行排序
merge(a, aux, lo, mid, hi); // 对已经排序的两个部分合并
}
private static void sort(int a[]) {
int aux[] = new int[a.length];
sort(a, aux, 0, a.length-1);
}
}