/**
* 归并排序:
* 时间复杂度: O(n*logn)
* 额外空间复杂度:O(n)
*/
public class MergeSort {
public static void mergeSort(int[] arr) {
if(arr == null || arr.length < 2) return;;
process(arr, 0, arr.length-1);
}
// 分治
public static void process(int[] arr, int L, int R) {
if (L < R) {
int mid = L+(R-L)/2;
process(arr, L, mid);
process(arr, mid+1, R);
merge(arr, L, mid, R);
}
}
// 合并数组,成为一个有序数组
public static void merge(int[] arr, int L, int mid, int R) {
int[] tmp = new int[R-L+1];
int i = 0;
int p1 = L;
int p2 = mid+1;
while (p1 <= mid && p2 <= R) {
tmp[i++] = arr[p1] > arr[p2] ? arr[p2++] : arr[p1++];
}
while (p1 <= mid) {
tmp[i++] = arr[p1++];
}
while (p2 <= R) {
tmp[i++] = arr[p2++];
}
for (i = 0;i < tmp.length; i++) {
arr[i+L] = tmp[i];
}
}
public static void main(String[] args) {
int size = 10;
int[] arr = new int[size];
int[] arr_ = new int[size];
// 随机生成10个1~100的正数进行排序
for (int i = 0; i < size; i++) {
arr[i] = (int) (Math.random() * 100 + 1);
arr_[i] = arr[i];
}
// 调用函数
mergeSort(arr);
Arrays.sort(arr_);
// 比较结果
for (int i = 0; i < size; i++) {
if (arr[i] != arr_[i]) System.out.println("排序错误,结果不一致!!");
}
// 输出排序结果
for (int i = 0; i < size; i++) {
System.out.printf("%d ", arr[i]);
}
}
}
归并排序(MergeSort)
最新推荐文章于 2024-10-09 11:13:12 发布