Chinaunix首页 | 论坛 | 博客
  • 博客访问: 475043
  • 博文数量: 93
  • 博客积分: 5006
  • 博客等级: 上校
  • 技术积分: 1002
  • 用 户 组: 普通用户
  • 注册时间: 2010-05-30 13:58
文章分类

全部博文(93)

文章存档

2012年(2)

2011年(68)

2010年(23)

分类: C/C++

2011-04-18 13:24:07

之前的博客写得有问题,且不好理解,现在给一个很好的例子,方便理解

这个时间复杂度O(n)的前提是存在n个数,且递增,知道第一个数及递增的多少
例举一个最简单的例子  初值1,每个数递增1
即a[0] = 1,
  a[1] = 2;  ……………………………………
 
  代码如下
 
for(int i = 0; i < n; )
{
     temp = a[a[i] -1];
     a[a[i] - 1] = a[i];
     a[i] = temp;
     if(a[i] == i + 1)
        i++;
}
 
本人认为该代码可行,对于有规律的数不失为一个好办法。

上面的是关键的代码,下面的是我的简单例子
panda@panda-pc:~/Code/c$ cat n_paixu.c
#include

int main(void)
{
    int i;
    int n = 10;
    int temp;
    int a[10] = {1,2,7,8,9,10,3,4,5,6};
    for( i = 0; i < n; )
    {
        temp = a[a[i] -1];
        a[a[i] - 1] = a[i];
        a[i] = temp;
        if(a[i] == i + 1)
           i++;
    }
    for(i = 0;i < n;i++)
    {
        printf("%d\t",a[i]);
    }
    printf("\n");
    return 0;
}
运行结果:
panda@panda-pc:~/Code/c$ ./n_paixu
1    2    3    4    5    6    7    8    9    10  

最后我有一个想法,既然都知道第一个数了,而且又知道数的个数了,可以直接赋值更简单啦…………

阅读(1525) | 评论(0) | 转发(0) |
0

上一篇:一个段错误

下一篇:perl循环

给主人留下些什么吧!~~