咔咔Zzy 发表于 2021-11-20 00:44:55

猴子排序

本帖最后由 咔咔Zzy 于 2021-11-20 17:11 编辑

课后作业S1E32:作用域和链接属性,猴子排序的一点小问题
代码如下;
如果把判断条件改为judge != length-2   增加一点容错可以几秒内跑出结果,但原代码几分钟都没法跑出来结果。
是代码有问题还是因为什么原因吗?

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

int bogo_sort(int array[], int length);

int bogo_sort(int array[], int length)
{
        int order,temp;
        int judge;
        static int t1, t2;
       
        do
        {
                //array = 73, array = 108, array = 111, array = 118, array = 101, array = 70, array = 105, array = 104, array = 67;//不复原好像也没关系
                judge = 0;// 判断条件judge归零
               
                // order[] 抽现存的数字中的第几个
                srand(t1);
              t1 = rand();
              t2 = time(NULL);
              srand(t1+t2);
                for(int i = 0,j = length; i < length; i++,j--)
                {
                        order = rand() % j;
                        //printf("%d",order);
                }
               
                //将 array[]中的数字按 order[]的顺序抽给 temp[]
                for(int i = 0; i<length; i++)
                {
                        int num;
                        num = order;
                        temp = array;
                        for(int j=num;j<length;j++)
                        {
                                array = array;
                        }
                }
               
                // temp[]传给 array[]并打印
                for(int i = 0; i<length; i++)
                {
                        array = temp;
                        printf("%d",array);
                }
                printf("\n");
               
                //判断是否 array < array
                for(int i = 0; i<length-1; i++)
                {
                        if(array < array)
                        {
                                judge++;
                        }
                }
        }while(judge != length-2);
        //每一个 array 都 < array 时 judge++ 了 length-1 次
       
        return 0;
}

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;
}

贝壳头 发表于 2021-11-20 00:44:56

本帖最后由 贝壳头 于 2021-11-21 23:03 编辑

咔咔Zzy 发表于 2021-11-21 22:31
是的,如果全部跑正确的话要3分钟以上,但是小甲鱼的代码可以10秒以内,所有就想问问哪里有什么问题

有几个方面呢、要一个一个尝试、元素太多也会影响排序效率,还有就是你代码优化、
猴子排序本身效率低 加之你的循环太多让效率更低

咔咔Zzy 发表于 2021-11-20 00:46:27

本帖最后由 咔咔Zzy 于 2021-11-20 00:51 编辑

大部分地方都是自己写的,随机数那里之前也是遇到了小甲鱼说的总是只输出几种特定的组合,所以参考了答案中对于随机数的处理

咔咔Zzy 发表于 2021-11-21 19:22:09

跟贴怎么跟~

贝壳头 发表于 2021-11-21 20:32:26

本帖最后由 贝壳头 于 2021-11-21 20:37 编辑

兄弟你几秒内跑出来的结果不正确啊,不整齐,结果都不正确,效率就不一样了啊!!!


咔咔Zzy 发表于 2021-11-21 22:31:23

贝壳头 发表于 2021-11-21 20:32
兄弟你几秒内跑出来的结果不正确啊,不整齐,结果都不正确,效率就不一样了啊!!!

是的,如果全部跑正确的话要3分钟以上,但是小甲鱼的代码可以10秒以内,所有就想问问哪里有什么问题

贝壳头 发表于 2021-11-22 11:10:36

如果有帮助到你请设置问题已经解决、
页: [1]
查看完整版本: 猴子排序