影影影影影少丶 发表于 2021-5-19 23:19:01

猴子排序一直出不来循环

请问大佬们,这代码是哪里有问题?
看似没问题每次随机都不一样,但是几分钟上百万次都随机不出正确答案。。。
顺带请教一下这种随机性代码怎么检查它有没有错过正确答案?
#include<stdio.h>
#include<stdlib.h>
#include<time.h>

void bogo_sort(int*,int);

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);//length = 9;
      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;
}

void bogo_sort(int *array,int length)
{
      int num1;//存放num2的下标
      int num2;//储存array的随机排序
      char ch;//判断数组是否排序成功
      int i,j;
      int count = 1;

      srand((unsigned)time(NULL));
      do{

                for(i = 0;i < length;i++)
                {
                        num1 = rand()%length;
                        for(j = 0;j < i;j++)
                        {
                              if(num1 == num1)
                              {
                                        i--;
                                        break;
                              }//保证下标不重复
               }
                }//随机生成num2的下标

                printf("第%d次num2的下标为:",count ++);
                for(i = 0;i < length;i ++)
                {
                        printf("%d ",num1);
                }
                putchar('\n');

                for(i = 0;i < length;i ++)
                {
                        num2] = array;
                }//用num2存放随机排序的array数组
                for(i = 0;i < length;i ++)
                {
                        for(j = 0;j < i;j ++)
                        {
                              if(num2 > num2)
                              {
                                        ch = 'N';
                                        break;
                              }
                              ch = 'Y';
                        }//检查num是否从小到大排序,成功为Y,不成功为N
                        if(ch == 'N')
                        {
                              break;
                        }//没有正确排序直接进入下一次循环
                }
                printf("排序后的结果是:");
                for(i = 0;i < length;i ++)
                {
                        printf("%d ",num2);
                }
                putchar('\n');
      }while(ch == 'N');

      for(i =0;i <length;i ++)
      {
                printf("我到了结尾!\n");
                array = num2;
      }//将排序好的数组放入array
}

人造人 发表于 2021-5-19 23:19:02

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

void bogo_sort(int*,int);

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


    begin = time(NULL);

    length = sizeof(array) / sizeof(array);//length = 9;
    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;
}

void bogo_sort(int *array,int length)
{
    int num1;//存放num2的下标
    int num2;//储存array的随机排序
    char ch;//判断数组是否排序成功
    int i,j;
    int count = 1;

    srand((unsigned)time(NULL));
    do{

      for(i = 0;i < length;i++)
      {
            num1 = rand()%length;
            for(j = 0;j < i;j++)
            {
                if(num1 == num1)
                {
                  i--;
                  break;
                }//保证下标不重复
            }
      }//随机生成num2的下标

      printf("第%d次num2的下标为:",count ++);
      for(i = 0;i < length;i ++)
      {
            printf("%d ",num1);
      }
      putchar('\n');

      for(i = 0;i < length;i ++)
      {
            num2] = array;
      }//用num2存放随机排序的array数组
      /*
      for(i = 0;i < length;i ++)
      {
            for(j = 0;j < i;j ++)
            {
                if(num2 > num2)
                {
                  ch = 'N';
                  break;
                }
                ch = 'Y';
            }//检查num是否从小到大排序,成功为Y,不成功为N
            if(ch == 'N')
            {
                break;
            }//没有正确排序直接进入下一次循环
      }
      */
      ch = 'Y';
      for(int i = 0; i < length - 1; ++i) {
            if(num2 > num2) {
                ch = 'N';
                break;
            }
      }
      printf("排序后的结果是:");
      for(i = 0;i < length;i ++)
      {
            printf("%d ",num2);
      }
      putchar('\n');
    }while(ch == 'N');

    for(i =0;i <length;i ++)
    {
      printf("我到了结尾!\n");
      array = num2;
    }//将排序好的数组放入array
}

影影影影影少丶 发表于 2021-5-20 08:49:37

人造人 发表于 2021-5-20 00:29


改成老哥这样确实能运行了,但是想请问下之前我那个判断是否排序成功的两层循环问题出在哪里呢?为什么之前运行那么多次都不能得到'Y'呢?

影影影影影少丶 发表于 2021-5-20 08:52:53

人造人 发表于 2021-5-20 00:29


老哥,我刚刚尝试了一下,把我原本的那两层循环里面的,ch = 'Y'提到了循环开始前也能正常运行了。
为什么ch = 'Y'在循环里面就不能正常呢?

影影影影影少丶 发表于 2021-5-20 08:55:54

人造人 发表于 2021-5-20 00:29


谢谢老哥,我悟了,因为没有重置ch的值,ch第一次循环如果是N值,后面都一直break了

人造人 发表于 2021-5-20 09:02:02

影影影影影少丶 发表于 2021-5-20 08:52
老哥,我刚刚尝试了一下,把我原本的那两层循环里面的,ch = 'Y'提到了循环开始前也能正常运行了。
为什 ...

载入gdb看一下就知道了
69                for(i = 0;i < length;i ++)
1: ch = 78 'N'
(gdb) n
71                    for(j = 0;j < i;j ++)
1: ch = 78 'N'
(gdb) print num2
$1 = {73, 108, 111}
(gdb) n
80                    if(ch == 'N')
1: ch = 78 'N'
(gdb) n
82                      break;
1: ch = 78 'N'
(gdb)

人造人 发表于 2021-5-20 09:02:51

可以看到 ch 一直是 ‘N’,即使顺序是对的,ch 也依然是 ‘N’

影影影影影少丶 发表于 2021-5-20 10:46:38

人造人 发表于 2021-5-20 09:02
可以看到 ch 一直是 ‘N’,即使顺序是对的,ch 也依然是 ‘N’

明白了,谢谢老哥^-^
页: [1]
查看完整版本: 猴子排序一直出不来循环