Ruch tablicowy od a1, .., an, b1, .., bn do a1, b1, .., an, bn

Dzisiaj spotkałem się z pytaniem, które mnie naprawdę zaintrygowało

Pytanie

Mam tablicę taką jak:arr[a1, a2, a3....an, b1, b2, b3.....bn], jak przesunąć elementy tablicy, aby ją przenieśćarr[a1, b1, a2, b2......an,bn], I powinieneś wykonać ruch w miejscu (space complexity should be constant).

Starałem się nad tym zastanowić i uzyskać brzydki algorytm, taki jak sortowanie bąbelkowe:

b1 moves forward by n - 1;
b2 moves forward by n - 2;
.
.
bn-1 moves forward by 1;

Ale złożoność czasu to O (n2), kto może dać mi lepszy algorytm? Znajduję inną lepszą metodę, taką jak szybkie sortowanie:

First we swap the element from a(n/2) to a(n) with the elements from b1 to b(n/2);now we get two independent sub problems,So we can solve it by recursion.
T(n) = 2T(n/2) + O(n) 
the time complexity is O(nlgn)

oto całe kody:

void swapArray(int *arr, int left, int right)
{
    int mid = (left + right) >> 1;
    int temp = mid + 1;
    while(left <= mid)
    {
        swap(arr[left++], arr[temp++]);
    }
}
void arrayMove(int *arr, int lb, int le, int rb, int re)
{
    if(le - lb <= 0 || re - rb <= 0)
        return;
    int mid = (lb + le + 1) >> 1;
    int len = le - mid;
    if(rb + len >= re)
    {
        swapArray(arr, mid + 1, rb);
    }
    else
    {
        swapArray(arr, mid, rb + len);
    }
    arrayMove(arr, lb, mid - 1, mid, le);
    arrayMove(arr, rb, rb + len, rb + 1 + len, re);
}

questionAnswers(7)

yourAnswerToTheQuestion