啊涂涂 发表于 2018-10-16 18:57:16

作用域和链接属性

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int in_order(int array[], int length);
void shuffle(int array[], int length);
void bogo_sort(int array[], int length);

int in_order(int array[], int length)
{
      int i = 0;

       while (array <= array && ++i < length - 1)
                ;

      if (i == length - 1)
      {
                return 1;
      }
      else
      {
                return 0;
      }
}

void shuffle(int array[], int length)
{
      int index, temp, i;
      static int t1, t2;

      srand(t1);
      t1 = rand();

      t2 = time(NULL);
      srand(t1+t2);

      for (i = 0; i < length; i++)
      {
                index = rand() % (length - i) + i;
                if (index != i)
                {
                        temp = array;
                        array = array;
                        array = temp;
                }
      }
}

void bogo_sort(int array[], int length)
{
      while (!in_order(array, length))
      {
                shuffle(array, length);
      }
}

int main(void)
{
      int array[] = {73, 108, 111, 118, 101, 70, 105, 104, 67};
      int i, length;
      time_t begin, end;

      begin = time(NULL);

      length = sizeof(array) / sizeof(array);
      bogo_sort(array, length);

      printf("排序后的结果是:");
      for (i = 0; i < length; i++)
      {
                printf("%d ", array);
      }
      putchar('\n');

      end = time(NULL);
      printf("总共耗时:%ld秒\n", end - begin);

      return 0;
}

无法正常运行,打开没有东西,会陷入死循环!

程序目的是实现无限猴子定理,用随机的方法打乱数组,总有一次数组会按照从小到大的顺序排列。

严重怀疑问题出在红色语句

claws0n 发表于 2018-10-16 19:11:38

{:10_247:} 你这是要排序吗???为何选猴子?慢死了~~算法好像有问题

啊涂涂 发表于 2018-10-16 19:17:40

哎呦,这个小甲鱼的课后作业,他是让实现这个算法呢,而且这个还是小甲鱼的正确答案,算法就是有问题,就在红字哪里,我自己试验了试验,后来发现好像第一个函数就不会进入 if 语句 ,只会进入 else

claws0n 发表于 2018-10-16 19:19:11

本帖最后由 claws0n 于 2018-10-16 19:20 编辑

啊涂涂 发表于 2018-10-16 19:17
哎呦,这个小甲鱼的课后作业,他是让实现这个算法呢,而且这个还是小甲鱼的正确答案,算法就是有问题,就在 ...

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int in_order(int array[], int length);
void shuffle(int array[], int length);
void bogo_sort(int array[], int length);

int in_order(int array[], int length)
{
        int i = 0;
       
        while (array <= array && ++i < length - 1)
        ;

        if (i == length - 1)
        {
        return 1;
        }
        else
        {
        return 0;
        }
}

void shuffle(int array[], int length)
{
    int index, temp, i;
    static int t1, t2;

    srand(t1);
    t1 = rand();

    t2 = time(NULL);
    srand(t1+t2);

    for (i = 0; i < length; i++)
    {
      index = rand() % (length - i) + i;
      if (index != i)
      {
            temp = array;
            array = array;
            array = temp;
      }
    }
}

void bogo_sort(int array[], int length)
{
    while (!in_order(array, length))
    {
      shuffle(array, length);
    }
}

int main(void)
{
    int array[] = {73, 108, 111, 118, 101, 70, 105, 104, 67};
    int i, length;
    time_t begin, end;

    begin = time(NULL);

    length = sizeof(array) / sizeof(array);
    bogo_sort(array, length);

    printf("排序后的结果是:");
    for (i = 0; i < length; i++)
    {
            printf("%d ", array);
    }
    putchar('\n');

    end = time(NULL);
    printf("总共耗时:%0.4lf秒\n", (double)(end - begin)/CLOCKS_PER_SEC);

    return 0;
}

啊涂涂 发表于 2018-10-16 19:23:22

claws0n 发表于 2018-10-16 19:19


怎么又复制了一遍?

claws0n 发表于 2018-10-16 19:25:46

啊涂涂 发表于 2018-10-16 19:23
怎么又复制了一遍?

?可以执行{:10_256:}

啊涂涂 发表于 2018-10-16 19:49:36

claws0n 发表于 2018-10-16 19:25
?可以执行

啊,我的电脑为啥不行呢?而且你看这个程序,如果从第一个函数进去的话是:
第一个i                      第二个i            第三个i            length == 10
    0                              1                  2   <   length - 1
    2                              3                  4
    4                              5                  6
你看像这个第一次拿0和1比,第二次就直接是2和3比了,那假如说2比一大那不就出问题了?

claws0n 发表于 2018-10-16 19:57:01

啊涂涂 发表于 2018-10-16 19:49
啊,我的电脑为啥不行呢?而且你看这个程序,如果从第一个函数进去的话是:
第一个i                  ...

这个算法是不保证收敛的,每一次进行打乱,然后结束,如果不是排序好的,重复……
跟你那个 i 不 i 的没有关系。他没有比较关系,哪一行? 26~47 只有赋值

啊涂涂 发表于 2018-10-16 20:03:15

claws0n 发表于 2018-10-16 19:57
这个算法是不保证收敛的,每一次进行打乱,然后结束,如果不是排序好的,重复……
跟你那个 i 不 i 的没 ...

嗯嗯,那第一个函数就是检测是否是按照顺序排列的嘛,那就像我刚才说的那样,那岂不是检测的不准确?而且最后退出 i 的时候结果 i 会比 length大,我拿纸推算了好几遍,就是一直不理解

啊涂涂 发表于 2018-10-16 20:06:26

你看我推算的那个,拿数组的第0个数和第一个比,然后第一个不和第二个比,直接跳到第二个和第三个比去了

那个array【i】-> array -> ++i   看这个 i 变了好多次呢

claws0n 发表于 2018-10-16 20:08:57

啊涂涂 发表于 2018-10-16 20:06
你看我推算的那个,拿数组的第0个数和第一个比,然后第一个不和第二个比,直接跳到第二个和第三个比去了

...

那个对呀,遍历数组的所有元素
第一跟第二比,第二跟第三比……

啊涂涂 发表于 2018-10-16 20:15:00

claws0n 发表于 2018-10-16 20:08
那个对呀,遍历数组的所有元素
第一跟第二比,第二跟第三比……

哦哦,哈哈,我迷糊了。那这个程序都没问题,在我的电脑上为啥不能运行呢?和系统有关?

claws0n 发表于 2018-10-16 20:22:40

啊涂涂 发表于 2018-10-16 20:15
哦哦,哈哈,我迷糊了。那这个程序都没问题,在我的电脑上为啥不能运行呢?和系统有关?

你什么编译器?

啊涂涂 发表于 2018-10-16 20:23:14

claws0n 发表于 2018-10-16 20:22
你什么编译器?

Dev C++

啊涂涂 发表于 2018-10-16 20:24:25

啊涂涂 发表于 2018-10-16 20:23
Dev C++

就小甲鱼视频上让推荐下载的那个,我是win10系统

claws0n 发表于 2018-10-16 20:25:37

啊涂涂 发表于 2018-10-16 20:23
Dev C++

有执行#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int in_order(int array[], int length);
void shuffle(int array[], int length);
void bogo_sort(int array[], int length);

int in_order(int array[], int length)
{
    int i = 0;
       
    while (array <= array && ++i < length - 1)
        ;

    if (i == length - 1)
    {
      return 1;
    }
    else
    {
      return 0;
    }
}

void shuffle(int array[], int length)
{
    int index, temp, i;
    static int t1, t2;

    srand(t1);
    t1 = rand();

    t2 = time(NULL);
    srand(t1+t2);

    for (i = 0; i < length; i++)
    {
      index = rand() % (length - i) + i;
      if (index != i)
      {
            temp = array;
            array = array;
            array = temp;
      }
    }
}

void bogo_sort(int array[], int length)
{
        int c = 0;
    while (!in_order(array, length))
    {
      shuffle(array, length);
      printf("%d\n",c++);
    }
}

int main(void)
{
    int array[] = {73, 108, 111, 118, 101, 70, 105, 104, 67};
    int i, length;
    time_t begin, end;

    begin = time(NULL);

    length = sizeof(array) / sizeof(array);
    bogo_sort(array, length);

    printf("排序后的结果是:");
    for (i = 0; i < length; i++)
    {
            printf("%d ", array);
    }
    putchar('\n');

    end = time(NULL);
    printf("总共耗时:%0.4lf秒\n", (double)(end - begin)/CLOCKS_PER_SEC);

    return 0;
}

啊涂涂 发表于 2018-10-16 20:27:24

claws0n 发表于 2018-10-16 20:25
有执行

行吧

啊涂涂 发表于 2018-10-16 20:39:28

claws0n 发表于 2018-10-16 20:25
有执行

麻烦我再问下,正确答案里,第一个函数 && 后面的 ++i < length - 1

这里++i的值之后,i 会变化吗?假如说 i 是1,++完之后会不会变成2呢?

claws0n 发表于 2018-10-16 20:43:44

啊涂涂 发表于 2018-10-16 20:39
麻烦我再问下,正确答案里,第一个函数 && 后面的 ++i < length - 1

这里++i的值之后,i 会变化吗? ...

当然会改变

啊涂涂 发表于 2018-10-16 20:57:42

claws0n 发表于 2018-10-16 20:43
当然会改变

#include <stdio.h>

int main(void)
{
                int array[] = {1, 2, 3, 4, 5};
                int length = 3;
                int i = 0;
               
                while (array <= array && ++i < length - 1)
                {
                                printf("%d", i);
                }
               
                return 0;
}

这是我又专门把刚才那个给划了出来,结果打印的是1, 不应该是2嘛
页: [1] 2
查看完整版本: 作用域和链接属性