11.1:迭代版的mergeSort
11.1:归并非递归实现
步长变化:
1 2 4 8 16 32 ... 一旦超过N步长停
logN次
1 // 非递归方法实现
2 public static void mergeSort(int[] arr) {
3 if (arr == null || arr.length < 2) {
4 return;
5 }
6 int N = arr.length;
7 // 步长
8 int mergeSize = 1;
9 while (mergeSize < N) { // log N
10
11 int L = 0; // 当前左组的,第一个 位置
12 while (L < N) { // L来到每一个左组的位置
13 int M = L + mergeSize - 1; // 当前左组最后一个元素的位置
14 if (M >= N) {
15 break; // 左组不够就结束了
16 }
//不越界的情况 M + 1 + mergeSize -1
//越界 N-1
//求最小值
17 int R = Math.min(M + mergeSize, N - 1); //右组最后一个数的位置
18 //L ... M M+1 ... R
19 merge(arr, L, M, R);
20 L = R + 1; //下一个左组的第一个数的位置
21 }
22 // 防止溢出
23 if (mergeSize > N / 2) { //当N十分靠近int整数最大值mergeSize * 2越界为负数
24 break;
25 }
26 mergeSize <<= 1; // 步长 X 2
27 }
28 }