public class Solution {
@Test
public void testFunction() {
int[] arr = {9,8,7,6,5,4,3,2,1};
mergeSort(arr);
for (int x : arr) {
System.out.print(x + " ");
}
}
// 归并排序-递归
// 首先选择中间的位置mid,然后对[l,mid],[mid+1,r]分别进行归并排序
// 最后利用一个新数组存储上面的两部分结果,再对这部分进行排序
// 优化:arr[mid] < arr[mid+1]时,本身是有序的,无需进行合并
public void mergeSort(int[] arr) {
merge_sort(arr, 0, arr.length - 1);
}
private void merge_sort(int[] arr, int l, int r) {
if (l == r) {
return;
}
int mid = (l + r) / 2;
merge_sort(arr, l, mid);
merge_sort(arr, mid + 1, r);
merge(arr, l, r, mid);
}
private void merge(int[] arr, int l, int r, int mid) {
if (l == r) {
return;
}
int[] temp = new int[r - l + 1];
for (int i = l; i <= r; i++) {
temp[i - l] = arr[i];
}
int first = 0;
int flag = mid - l;
int next = flag + 1;
if (arr[mid] < arr[mid+1]) {
return;
}
int i = l;
while (first <= flag && next <= r-l) {
if (first <= flag && temp[first] < temp[next]) {
arr[i] = temp[first];
first++;
} else if (next <= r && temp[first] >= temp[next]) {
arr[i] = temp[next];
next++;
}
i++;
}
while (first <= flag) {
arr[i] = temp[first];
i++;
first++;
}
while (next <= r-l) {
arr[i] = temp[next];
i++;
next++;
}
}
@Test
public void testFunction() {
int[] arr = {9,8,7,6,5,4,3,2,1};
mergeSort(arr);
for (int x : arr) {
System.out.print(x + " ");
}
}
// 归并排序-递归
// 首先选择中间的位置mid,然后对[l,mid],[mid+1,r]分别进行归并排序
// 最后利用一个新数组存储上面的两部分结果,再对这部分进行排序
// 优化:arr[mid] < arr[mid+1]时,本身是有序的,无需进行合并
public void mergeSort(int[] arr) {
merge_sort(arr, 0, arr.length - 1);
}
private void merge_sort(int[] arr, int l, int r) {
if (l == r) {
return;
}
int mid = (l + r) / 2;
merge_sort(arr, l, mid);
merge_sort(arr, mid + 1, r);
merge(arr, l, r, mid);
}
private void merge(int[] arr, int l, int r, int mid) {
if (l == r) {
return;
}
int[] temp = new int[r - l + 1];
for (int i = l; i <= r; i++) {
temp[i - l] = arr[i];
}
int first = 0;
int flag = mid - l;
int next = flag + 1;
if (arr[mid] < arr[mid+1]) {
return;
}
int i = l;
while (first <= flag && next <= r-l) {
if (first <= flag && temp[first] < temp[next]) {
arr[i] = temp[first];
first++;
} else if (next <= r && temp[first] >= temp[next]) {
arr[i] = temp[next];
next++;
}
i++;
}
while (first <= flag) {
arr[i] = temp[first];
i++;
first++;
}
while (next <= r-l) {
arr[i] = temp[next];
i++;
next++;
}
}
}
//在r-l<15时,可以选择插入排序