Java算法–第三章–排序(3)归并排序
1.归并排序Merge Sort)算法完全依照了分治模式
(1)分解:将n个元素分成各含n/2个元素的子序列;
(2)解决:对两个子序列递归地排序;
(3)合并:合并两个已排序的子序列以得到排序结果
2.和快排不同的是:归并的分解较为随意,重点是合并
代码:
package sort;
import java.util.Arrays;
public class NormalizingSort {
public static void main(String[] args) {
int[] arr = new int[] { 9, 5, 2, 10, 7, 3, 1, 4 };
System.out.println(Arrays.toString(arr));
normsort(arr, 0, arr.length - 1);
System.out.println(Arrays.toString(arr));
}
private static void normsort(int[] arr, int low, int high) {
if (arr == null)
return;
int middle = low + ((high - low) >> 1);
sort(arr, low, middle);
sort(arr, middle + 1, high);
merge(arr, low, middle, high);// 合并
}
private static void merge(int[] arr, int low, int middle, int high) {
int[] help = Arrays.copyOf(arr, arr.length);
int index1 = low;
int index2 = middle + 1;
int i = 0;
while (index1 <= middle && index2 < arr.length) {
if (help[index1] < help[index2]) {
arr[i] = help[index1];
index1++;
i++;
} else {
arr[i] = help[index2];
index2++;
i++;
}
}
while (index1 <= middle) {
arr[i] = help[index1];
index1++;
i++;
}
while (index2 < arr.length) {
arr[i] = help[index2];
index2++;
i++;
}
}
private static void sort(int[] arr, int low, int high) {
for(int i = 1;i < arr.length;i++) {
int inval = arr[i];
int index = i - 1;
while(index >= 0 && inval < arr[index]) {
arr[index + 1] = arr[index];
index--;
}
arr[index + 1] = inval;
}
}
}
输出:
[9, 5, 2, 10, 7, 3, 1, 4]
[1, 2, 3, 4, 5, 7, 9, 10]