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 }

 

 

posted @ 2022-05-11 15:43  yzmarcus  阅读(22)  评论(0编辑  收藏  举报