归并排序
主要思想
- 分治的思想,数组分为2部分,左右分别排好序。
- 主要是merge思想
相关题目
- 求逆序对
- 求数组的小和
代码实现
@Test
public void test() {
int arr[] = new int[]{10, 2, 5, 6};
mergeSort(arr);
for (int i = 0; i < arr.length; i++) {
System.out.println(arr[i]);
}
}
public void mergeSort(int arr[]) {
if (arr.length == 1 ) {
return;
}
sort(arr, 0, arr.length-1);
}
private void sort(int[] arr, int begin, int end) {
if (end == begin) {
return;
}
int middle = begin + ((end - begin) >> 1);
sort(arr, begin, middle);
sort(arr, middle + 1, end);
merge(arr, begin, middle, end);
}
private void merge(int[] arr, int begin, int middle, int end) {
int leftStart = begin;
int rightStart = middle + 1;
int helpIndex = 0;
int[] help = new int[end - begin + 1];
while (leftStart <= middle && rightStart <= end) {
help[helpIndex++] = arr[leftStart] <= arr[rightStart] ? arr[leftStart++] : arr[rightStart++];
}
while (leftStart <= middle) {
help[helpIndex++] = arr[leftStart++];
}
while (rightStart <= end) {
help[helpIndex++] = arr[rightStart++];
}
for (int i = 0; i < help.length; i++) {
arr[begin + i] = help[i];
}
}