归并排序
1、概念
归并排序是一种基于分治法,将待排序的元素序列分成两个长度相等的子序列,为每一个子序列排序,然后再将他们合并成一个子序列。合并两个子序列的过程也就是两路归并。
public static void main(String[] args)
{
int[] a = { 9, 25, 54, 87, 7, 19, 68, 51, 49 };
System.out.println("原始数据:");
for (int num : a)
System.out.print(num + " ");
System.out.println();
mergeSort(a, 0, a.length-1);
System.out.println("进行归并排序:");
for (int num : a)
System.out.print(num + " ");
}
private static void mergeSort(int[] a, int start, int end) {
if (start < end) {
int mid = (end + start) >> 1; // 拆分
mergeSort(a, start, mid); //对拆分后左侧数据进行递归
mergeSort(a, mid + 1, end);
merge(a, start, mid, end); //归并
}
}
private static void merge(int[] a, int start, int mid, int end) {
int[] temp = new int[a.length]; //临时数组
// left, right 为左右指针
int left = start, right = mid + 1, t = start;
while (left <= mid && right <= end) {
if (a[left] <= a[right]) {
temp[t++] = a[left++];
} else {
temp[t++] = a[right++];
}
}
// 当右边提前结束时,直接将左边的元素移过去
while (left <= mid) {
temp[t++] = a[left++];
}
while ( right <= end) {
temp[t++] = a[right++];
}
// 复制
for (int i = start; i <= end ; i++) {
a[i] = temp[i];
}
}