合并排序是一种分而治之的思想。
将待排序元素分成两半,分别对两半进行排序,最终将排好的两半又合并。
实现代码如下:
public class MergeSort {
public static 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); // 对右侧排序
// 合并两段排序数组到数组b中
// 再拷贝回数组a中
Merge(a, left, mid, right);
}
}
private static void Merge(int[] a, int left, int mid, int right) {
int b[] = new int[right - left + 1];
int i, j, k = 0;// k为数组b的下标
i = left;
j = mid + 1;
while (i <= mid && j <= right) {
if (a[i] > a[j])
b[k++] = a[j++];
else
b[k++] = a[i++];
}
if (i > mid)
for (int q = j; q <= right; q++)
b[k++] = a[q];
else
for (int q = i; q <= mid; q++)
b[k++] = a[q];
int pos = left;
for (i = 0; i <= b.length - 1; i++) {
a[pos++] = b[i];
}
}
public static void main(String[] args) throws IOException {
System.out.println(" +--- 合并排序,递归算法 ---+ \n 数组长度: ");
Scanner reader = new Scanner(System.in);
int len = reader.nextInt();
int a[] = new int[len];// 初始化a数组
System.out.println("初始数组如下:");
for (int i = 0; i < a.length; i++) {
a[i] = reader.nextInt();
//a[i] = (int) (Math.random() * 1000); // 产生len个随机数 (<1000)
System.out.println(a[i]);
}
mergeSort(a, 0, a.length - 1);
System.out.println("排序后的数组如下:");
for (int i = 0; i < a.length; i++) {
System.out.println(a[i]);
}
}
}
刚开始我把两部分合并到同一数组的Merge()函数和将数组b复制回数组a的Copy()函数分开写,结果总是错误的。弄了大早上每弄好,可能是复制过去的时候传的不是合并的那个数组b。所以还是建议写在同一个函数中,就不用传参传参了。但这样也用不好之处,就是没有做到每个函数对应一个功能的优秀代码风格。