归并排序
思路
- 核心思想是利用分治的方式进行递归处理
- merge过程是将两个有序的区间进行合并成为一个有序的区间,所以需要借助一个辅助空间
- 时间复杂度 O(N * logN) 空间复杂度O(N)
import java.util.Scanner;
public class Merge_Sort {
static int N = 100010;
static int[] q = new int[N], tmp = new int[N];
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
for (int i = 0; i < n; i++) q[i] = sc.nextInt();
merge_sort(q, 0, n - 1);
for (int i = 0; i < n; i++) System.out.print(q[i] + " ");
sc.close();
}
static void merge_sort(int[] q, int l, int r) {
if (l >= r) return;
int mid = l + r >> 1;
merge_sort(q, l, mid);
merge_sort(q, mid + 1, r);
merge(q, l, mid, r);
}
private static void merge(int[] q, int l, int mid, int r) {
int i = l, j = mid + 1, k = 0;
while (i <= mid && j <= r) {
if (q[i] < q[j]) {
tmp[k ++] = q[i ++];
} else {
tmp[k ++] = q[j ++];
}
}
while (i <= mid) tmp[k ++] = q[i ++];
while (j <= r) tmp[k ++] = q[j ++];
for (i = l, j = 0; i <= r; i ++) q[i] = tmp[j ++];
}
}