分治排序
public class DivideSort {
public static void divide(int[] arr, int start, int split, int end) {
System.out.printf("分解:");
for (int i = start; i <= end; i++) {
if (i == split) {
System.out.printf("(%d)t", arr[i]);
} else {
System.out.printf("%dt", arr[i]);
}
}
System.out.println();
if (split - start > 1) {
divide(arr, start, (start + split) / 2, split);
} else {
if (arr[start] > arr[split]) {
conquer(arr, start, split);
}
}
if (end - split > 1) {
divide(arr, split, (end + split) / 2, end);
} else {
if (arr[split] > arr[end]) {
conquer(arr, split, end);
}
}
combine(arr, start, split, end);
}
public static void conquer(int[] arr, int start, int end) {
System.out.printf("start:%d,end:%dn", start, end);
int temp = arr[start];
arr[start] = arr[end];
arr[end] = temp;
for (int i : arr) {
System.out.printf("%dt", i);
}
System.out.println();
System.out.println("==================");
}
public static void combine(int[] arr, int start, int split, int end) {
System.out.printf("合并:start:%d,split:%d,end%dn", start, split, end);
int[] temp = new int[end - start + 1];
int index = 0;
int left = start;
int right = split;
while (left < split || right <= end) {
if (left >= split) {
temp[index] = arr[right];
right++;
} else if (right > end) {
temp[index] = arr[left];
left++;
} else if (arr[left] > arr[right]) {
temp[index] = arr[right];
right++;
} else {
temp[index] = arr[left];
left++;
}
index++;
}
if (temp.length >= 0) {
System.arraycopy(temp, 0, arr, start, temp.length);
}
System.out.print("合并后:t");
for (int i : arr) {
System.out.printf("%dt", i);
}
System.out.println();
}
public static void sort(int[] arr) {
divide(arr, 0, (arr.length - 1) / 2, arr.length - 1);
}
public static void main(String[] args) {
// 生成多少个数字
int size = 1000;
// 多少个数换行
int linefeed=100;
int[] arr = new int[size];
for (int i = 0; i < size; i++) {
arr[i] = (int) (Math.random() * size);
}
long startTime = System.currentTimeMillis();
System.out.println("排序前:");
for (int i = 0; i < arr.length; i++) {
System.out.printf("%dt", arr[i]);
if ((i + 1) % linefeed == 0) {
System.out.println();
}
}
sort(arr);
long endTime = System.currentTimeMillis();
System.out.println("排序耗时(毫秒):" + (endTime - startTime));
System.out.println("排序后:");
for (int i = 0; i < arr.length; i++) {
System.out.printf("%dt", arr[i]);
if ((i + 1) % linefeed == 0) {
System.out.println();
}
}
}
}