首页 > 其他 > 详细

一个小小的算法优化

时间:2014-02-13 21:32:33      阅读:346      评论:0      收藏:0      [点我收藏+]

百度知道上,遇到一个提问:
对1 2 3 4 5 6 7 8 9 10进行重新排列,输出8 9 10 1 2 3 4 5 6 7。

原解法写成了n*m次移动

bubuko.com,布布扣
for(j=1;j<=3;j++)
{
   k=a[9];
   for(i=9;i>0;i--)
      a[i]=a[i-1];
   a[0]=k;    
}
bubuko.com,布布扣

分析:n个数中移动m个的,应该只需要n+m个空间移动n+m次或0空间交换n次。。

如果有13个空间,可以直接向后移动三个元素再重新插入,次数等于n+m次。

bubuko.com,布布扣
#define N  10
#define M  3
for (int i = 0; i < N - M; ++i) 
   a[N + M - 1 + i] = a[N - 1 - i];
for (int i = 0; i < M; ++i)
   a[M - 1 - i] = a[N + M - 1 + i];
bubuko.com,布布扣

如果没有空间,通过整体交换,只交换3+3+4次,相当于int(n / m) * m + int(m / (n mod m))*(n mod m)次等于n次。

bubuko.com,布布扣
//把q位上的n个数移动到p位上。
void swapall(int a[], int p, int q, int n)
  {
        for (int i = 0; i  < n; i ++) {
            int x = a[q + i];
            a[q + i] = a[p + i];
            a[p + i] = a[q + i];
        }
}
/* p < q, n > 1 */
void move(int a[], int p, int q, int n) {
    while ( p + n < q) {
        swapall(a, p, q, n);
        p = p + n;
    }

    while ( q - p < n) {
        int m = q - p;
        swapall (a, p, q, m);
        n = n - m;
        p = q;
        q = p + m;
    }
}
bubuko.com,布布扣

一个小小的算法优化

原文:http://www.cnblogs.com/ahuangliang/p/3547997.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!