自然排序
自然合并排序:对于初始给定的数组,通常存在多个长度大于1的已自然排好序的子数组段.例如,若数组a中元素为{4,8,3,7,1,5,6,2},则自然排好序的子数组段有{4,8},{3,7},{1,5,6},{2}.用一次对数组a的线性扫描就足以找出所有这些排好序的子数组段.然后将相邻的排好序的子数组段两两合并,构成更大的排好序的子数组段({3,4,7,8},{1,2,5,6}).继续合并相邻排好序的子数组段,直至整个数组已排好
核心代码:
public void mergeSort(int[] a) {
int len = 1;
while (len < a.length) {
for (int i = 0; i < a.length; i += 2 * len) {
merge(a, i, len);
}
len *= 2;
}
}
整体代码:
package 合并;
import java.util.Arrays;
public class Sort {
public static void main(String args[]) {
Sort mer = new Sort();
int[] array = {4, 8, 3, 7, 1, 5, 2, 6};
System.out.println("原数据:" + Arrays.toString(array));
mer.mergeSort(array);
System.out.println("排序以后:" + Arrays.toString(array));
}
public void mergeSort(int[] a) {
int len = 1;
while (len < a.length) {
for (int i = 0; i < a.length; i += 2 * len) {
merge(a, i, len);
}
len *= 2;
}
}
public void merge(int[] a, int i, int len) {
int start = i;
int X = i + len;// 归并的前半部分数组
int j = i + len;
int Y = j + len;// 归并的后半部分数组
int[] temp = new int[2 * len];
int count = 0;
while (i < X && j < Y && j < a.length) {
if (a[i] <= a[j]) {
temp[count++] = a[i++];
} else {
temp[count++] = a[j++];
}
}
while (i < X && i < a.length) {
temp[count++] = a[i++];
}
while (j < Y && j < a.length) {
temp[count++] = a[j++];
}
count = 0;
while (start < j && start < a.length) {
a[start++] = temp[count++];
}
}
}
运行结果: