ネストの深いアルゴリズム

ところで、ネストが深いアルゴリズムといったら、batcher's odd-even mergesortを思い出す。

template <class Item>
void batchersort(Item a[], int l, int r)
 { int N = r-l+1;
   for (int p = 1; p < N; p += p)
    for (int k = p; k > 0; k /= 2)
     for (int j = k%p; j+k < N; j += (k+k))
      for (int i = 0; i < N-j-k; i++)
       if ((j+i)/(p+p) == (j+i+k)/(p+p))
        { Item &a0 = a[l+j+i], &a1 = a[l+j+i+k], t;
          if (a1 < a0) { t = a0; a0 = a1; a1 = t;}}
 }

上のは、某テキストからコピーしてきたのだけれど、ループが1つ不要じゃないか? つまり、下のでいいんじゃない?

template <class Item>
void batchersort(Item a[], int l, int r)
 { int N = r-l+1;
   for (int p = 1; p < N; p += p)
    for (int k = p; k > 0; k /= 2)
     for (int i = k%p; i < N-k; i++)
      if (i/(p+p) == (i+k)/(p+p))
       { Item &a0 = a[l+i], &a1 = a[l+i+k], t;
         if (a1 < a0) { t = a0; a0 = a1; a1 = t;}}
 }

アルゴリズムに忠実に書くなら、こうなるのか?

template <class Item>
void batchersort(Item a[], int l, int r)
 { int N = r-l+1;
   for (int p = 1; p < N; p += p)
    for (int k = p; k > 0; k /= 2)
     for (int j = k%p, i = j; i < N-k; i++)
      if ((i-j)/(k+k) == (i+k-j)/(k+k) && i/(p+p) == (i+k)/(p+p))
       { Item &a0 = a[l+i], &a1 = a[l+i+k], t;
         if (a1 < a0) { t = a0; a0 = a1; a1 = t;}}
 }