论坛首页 综合技术论坛

请大家解一个算法题目(呵呵最近迷上算法了..可惜偶有点笨哦)

浏览 4270 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2007-06-20  
设a[0:n-1]是一个有n个元素的数组,k(0≦k≦n-1)是一个非负整数。试设计一个算法将子数组a[0:k]与a[k+1:n-1]换位。要求算法在最坏的情况下耗时O(n),且只用到O(1)的辅助空间。  
   
  要求用C语言编写!谢谢!
   发表时间:2007-06-20  
引用
将子数组a[0:k]与a[k+1:n-1]换位

嘛意思?
是说讲a[0,k]移到a[n-k-1,n-1],a[k+1,n-1]移到a[0,n-k-2]么?
0 请登录后投票
   发表时间:2007-06-22  
len=min(k,n-k)
for(i=0;i<len;i++)
  swap(a[k-i],a[k+i+1])

0 请登录后投票
   发表时间:2007-06-23  
随手写的,没经过测试,边界条件可能有问题。
数学没学好,不会证明时间复杂度是O(n).不过感觉上是O(n)的。请达人指点。
void swap(int *p1, int *p2, int length)
{
    int i, t;
    for (i = 0; i < length; ++i) {
        t = *(p1 + i);
        *(p1 + i) = * (p2 + i);
        *(p2 + i) = t;
    }
}
void exchange(int *begin, int length, int k)
{
    if (length <= 1)
        return;
    if (k <= (length << 1)) {
        swap(begin, begin + length - k, k);
        exchange(begin, length - k, k);
    }
    else {
        swap(begin, begin + k, length - k);
        exchange(begin + length - k, k, 2 * k - length);
    }
}

int main()
{
    ...
    exchange(a, n, k);
}
0 请登录后投票
论坛首页 综合技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics