排序算法归并排序
Posted EileenChang
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了排序算法归并排序相关的知识,希望对你有一定的参考价值。
算法思路
归并排序有以下几个步骤:
- 将数组分成左右两个部分。
- 对左边进行排序。
- 对右边进行排序。
- 使用排外序的方法将左右两边合并。
时间复杂度
根据Master公式,归并排序的时间复杂度为O(N * logN)。
代码
public class MergeSort {
/**
* 利用递归实现归并排序
*/
public static void mergeSort(int[] arr, int left, int right) {
// 当left == right时,数组在left到right范围内是有序的,直接返回
if (ArrayUtil.isEmpty(arr) || left == right) {
return;
}
// 得到数组中间位置下标
int mid = left + ((right - left) >> 1);
// 对左边进行排序
mergeSort(arr, left, mid);
// 对右边进行排序
mergeSort(arr, mid + 1, right);
// 将左右两边合并
merge(arr, left, mid, right);
}
/**
* 归并
* 这个过程,时间复杂度为 O(N)
*/
public static void merge(int[] arr, int left, int mid, int right) {
int length = right - left + 1;
int[] help = new int[length];
int leftPointer = left;
int rightPointer = mid + 1;
int helpPointer = 0;
while (leftPointer <= mid && rightPointer <= right) {
if (arr[leftPointer] < arr[rightPointer]) {
help[helpPointer++] = arr[leftPointer++];
} else {
help[helpPointer++] = arr[rightPointer++];
}
}
if (leftPointer <= mid) {
System.arraycopy(arr, leftPointer, help, helpPointer, mid - leftPointer + 1);
}
if (rightPointer <= right) {
System.arraycopy(arr, rightPointer, help, helpPointer, right - rightPointer + 1);
}
System.arraycopy(help, 0, arr, left, length);
}
}
以上是关于排序算法归并排序的主要内容,如果未能解决你的问题,请参考以下文章