今日、私は本当に困惑している質問に出会いました
質問
私は のような配列を持っています: arr[a1, a2, a3....an, b1, b2, b3.....bn]
, 配列の要素を移動して に転送する方法arr[a1, b1, a2, b2......an,bn]
, そして移動はその場で行う必要があります.
私はそれをよく考えてみて、バブルソートのような醜いアルゴリズムを得るために最善を尽くしました:
b1 moves forward by n - 1;
b2 moves forward by n - 2;
.
.
bn-1 moves forward by 1;
しかし、時間計算量は O(n 2 ) です。より良いアルゴリズムを教えてくれる人はいますか? クイックソートと同じように、別のより良い方法を見つけました。
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)
ここにコード全体があります:
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);
}