鱼C论坛

 找回密码
 立即注册
查看: 1231|回复: 3

[已解决]C语言作业 作用域和链接属性 求助

[复制链接]
发表于 2021-4-10 16:52:10 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 chinesestcx 于 2021-4-11 09:20 编辑

作用域和链接属性[url=S1E32:作用域和链接属性 | 课后测试题及答案 https://fishc.com.cn/thread-78121-1-1.html (出处: 鱼C论坛)]链接[/url]

  1. #include<stdio.h>
  2. #include<stdlib.h>

  3. void bogo_sort(int *p,int len)
  4. {      
  5.         int flag = 0,temp;
  6.         srand(time(NULL));
  7.         while(1)
  8.         {
  9.                 for(int i=0,k;i<len;i++)
  10.                 {
  11.                         k = rand()%len;
  12.                         temp = p[k];
  13.                         p[k] = p[i];
  14.                         p[i] = temp;
  15.                         // p[i] += p[k];
  16.                         // p[k] = p[i] - p[k];
  17.                         // p[i] = p[i] - p[k];
  18.                 }
  19.                 for(int i=0;i<len-1;i++)
  20.                 {
  21.                         if(p[i]>p[i+1])break;
  22.                         if(i == len-2)flag = 1;
  23.                 }
  24.                 if(flag)break;
  25.         }
  26. }


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

  32.         begin = time(NULL);

  33.         length = sizeof(array) / sizeof(array[0]);
  34.         bogo_sort(array, length);

  35.         printf("排序后的结果是:");
  36.         for (i = 0; i < length; i++)
  37.         {
  38.                 printf("%d ", array[i]);
  39.         }
  40.         putchar('\n');

  41.         end = time(NULL);
  42.         printf("总共耗时:%d秒\n", end - begin);
  43.         system("pause");
  44.         return 0;
  45. }
复制代码


这是之前的源代码,只是交换两个变量值的算法不同,产生的结果大相径庭

  1. // p[i] += p[k];
  2.                         // p[k] = p[i] - p[k];
  3.                         // p[i] = p[i] - p[k];
复制代码



像上面这样写就会发生 结果错误,但实际上交换变量除了可以借助第三个变量,还可以使用上面的这种方法,这两种方法的功能是完全一样的,不知到为什么结果不一样

最佳答案
2021-4-14 09:04:03
你如果真的想不消耗额外空间交换的话  加个条件

  1. void bogo_sort(int* p, int len)
  2. {
  3.     int flag = 0;
  4.     int temp;
  5.     srand(time(NULL));
  6.     while (1)
  7.     {
  8.         for (int i = 0, k; i < len; i++)
  9.         {
  10.             k = rand() % len;

  11.             if (k == i)
  12.                 continue;
  13.             /*temp = p[k]
  14.             p[k] = p[i];
  15.             p[i] = temp;*/
  16.             p[i] += p[k];
  17.             p[k] = p[i] - p[k];
  18.             p[i] = p[i] - p[k];
  19.         }

  20.         for (int i = 0; i < len - 1; i++)
  21.         {
  22.             if (p[i] > p[i + 1])break;
  23.             if (i == len - 2)flag = 1;
  24.         }
  25.         if (flag)break;
  26.     }
  27. }
复制代码


本身这种排序就是用来搞笑的
捕获.PNG
捕获1.PNG
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-4-13 22:35:04 | 显示全部楼层
我知道问题所在了,因为两个变量 在不涉及第三个变量在利用差值的情况下进行互换,如果这两个值相同的话,会被归零
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-4-13 22:35:55 | 显示全部楼层
随便来个什么鱼友,我给你最佳解答
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-4-14 09:04:03 | 显示全部楼层    本楼为最佳答案   
你如果真的想不消耗额外空间交换的话  加个条件

  1. void bogo_sort(int* p, int len)
  2. {
  3.     int flag = 0;
  4.     int temp;
  5.     srand(time(NULL));
  6.     while (1)
  7.     {
  8.         for (int i = 0, k; i < len; i++)
  9.         {
  10.             k = rand() % len;

  11.             if (k == i)
  12.                 continue;
  13.             /*temp = p[k]
  14.             p[k] = p[i];
  15.             p[i] = temp;*/
  16.             p[i] += p[k];
  17.             p[k] = p[i] - p[k];
  18.             p[i] = p[i] - p[k];
  19.         }

  20.         for (int i = 0; i < len - 1; i++)
  21.         {
  22.             if (p[i] > p[i + 1])break;
  23.             if (i == len - 2)flag = 1;
  24.         }
  25.         if (flag)break;
  26.     }
  27. }
复制代码


本身这种排序就是用来搞笑的
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-4-30 03:58

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表