33,008
社区成员
发帖
与我相关
我的任务
分享
#define n 29
void Swap(int& a, int& b)
{
int temp = b;
b = a;
a = temp;
}
void SwapTest(int* a, int begin, int end)
{
if (end - begin == 1 || (end - begin + 1) % 2 != 0 )
{
return;
}
if ((end - begin + 1) % 4 == 0)
{
int length = (end - begin + 1) / 4;
for (int i = length; i < 2 * length; i++)
{
Swap(a[begin + i], a[begin + i + length]);
}
SwapTest(a, begin, begin + 2 * length - 1);
SwapTest(a, begin + 2 * length, end);
}
else
{
int length = (end - begin + 1) / 4;
for (int i = length + 1; i < 2 * length + 1; i++)
{
Swap(a[begin + i], a[begin + i + length]);
}
for (int i = 3 * length + 1; i > 2 * length + 1; i--)
{
Swap(a[begin + i], a[begin + i - 1]);
}
SwapTest(a, begin, begin + 2 * length + 1);
SwapTest(a, begin + 2 * length + 2, end);
}
}
int _tmain(int argc, _TCHAR* argv[])
{
int* a = new int[2 * n];
for (int i = 0; i < 2 * n; i++)
{
if (i < n)
{
a[i] = 2 * i + 1;
}
else
{
a[i] = 2 * (i - n + 1);
}
}
printf("before swap, the array is:\r\n");
for (int i = 0; i < 2 * n; i++)
{
printf("%d ", a[i]);
}
printf("\r\n");
SwapTest(a, 0, 2 * n - 1);
printf("after swap, the array is:\r\n");
for (int i = 0; i < 2 * n; i++)
{
printf("%d ", a[i]);
}
printf("\r\n");
delete [] a;
return 0;
}
用了分治的算法,复杂度应该符合楼主要求,楼主试试看
Array.prototype.cross = function(arr) {
return this.length ? [this.slice(0, 1), arr.slice(0, 1)].concat(this.slice(1).cross(arr.slice(1))) : [];
}
var a = ["a1", "a2", "a3", "......", "an", "b1", "b2", "b3", "......", "bn"];
alert(a.slice(0, a.length >>> 1).cross(a.slice(a.length >>> 1)))