归并排序,采用了分而治之的思想,原理图如下所示:
分成一个个独立的元素之后,开始根据大小关系重新组合(关系可以自定义),组合时需要用到辅助数组,为了避免每次都要用新的辅助数组,我们从外部传入一个辅助数组temp
下面是代码:
public void mergeSort(int[] arr, int left, int right, int[] temp) {
if (left < right) {
int mid = (left + right) / 2;//此处为了避免大数溢出,应该这样:int mid = left + (right - left) / 2
mergeSort(arr, left, mid, temp);
mergeSort(arr, mid + 1, right, temp);
merge(arr, left, mid, right, temp);
}
}
private void merge(int[] arr, int left, int mid, int right, int[] temp) {
int i = left, j = mid + 1, k = 0;
while (i <= mid && j <= right) {
if (arr[i] <= arr[j]) {
temp[k] = arr[i];
k++;
i++;
} else {
temp[k] = arr[j];
k++;
j++;
}
}
while (i <= mid) {
temp[k] = arr[i];
k++;
i++;
}
while (j <= right) {
temp[k] = arr[j];
k++;
j++;
}
int tempLeft = left, l = 0;
while (tempLeft <= right) {
arr[tempLeft] = temp[l];
tempLeft++;
l++;
}
}