11.1:迭代版的mergeSort


11.1:归并非递归实现

 

 

 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) {
13                 int M = L + mergeSize - 1; // 当前左组最后一个元素的位置
14                 if (M >= N) {
15                     break;                 // 左组不够就结束了
16                 }
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     }