/**
*归并排序
*/
public class Merge {
public static void main(String[] args) {
int[] arr = {6, 1, 2, 2, 9, 3, 4, 5, 10, 8};
Merge me = new Merge();
me.mergeSort(arr, 0, arr.length - 1);
System.out.println(Arrays.toString(arr));
}
//两路归并算法,两个排好序的子序列合并为一个子序列
public void merge(int[] a, int left, int mid, int right) {
int[] tmp = new int[a.length];//辅助数组
int p1 = left, p2 = mid + 1, k = left;//p1、p2是检测指针,k是存放指针
while (p1 <= mid && p2 <= right) {
if (a[p1] <= a[p2]) {
tmp[k++] = a[p1++];
} else {
tmp[k++] = a[p2++];
}
}
while (p1 <= mid) {
tmp[k++] = a[p1++];//如果第一个序列未检测完,直接将后面所有元素加到合并的序列中
}
while (p2 <= right) {
tmp[k++] = a[p2++];//同上
}
//复制回原素组
for (int i = left; i <= right; i++) {
a[i] = tmp[i];
}
}
public void mergeSort(int[] a, int left, int right) {
if (left < right) {//当子序列中只有一个元素时结束递归
int mid = (left + right) / 2;//划分子序列
mergeSort(a, left, mid);//对左侧子序列进行递归排序
mergeSort(a, mid + 1, right);//对右侧子序列进行递归排序
merge(a, left, mid, right);//合并
}
}
}
声明:部分图片来源网络