鱼C论坛

 找回密码
 立即注册
查看: 1040|回复: 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]
#include<stdio.h>
#include<stdlib.h>

void bogo_sort(int *p,int len)
{       
        int flag = 0,temp;
        srand(time(NULL));
        while(1)
        {
                for(int i=0,k;i<len;i++)
                {
                        k = rand()%len;
                        temp = p[k];
                        p[k] = p[i];
                        p[i] = temp;
                        // p[i] += p[k];
                        // p[k] = p[i] - p[k];
                        // p[i] = p[i] - p[k]; 
                }
                for(int i=0;i<len-1;i++)
                {
                        if(p[i]>p[i+1])break;
                        if(i == len-2)flag = 1;
                }
                if(flag)break;
        }
}


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[0]);
        bogo_sort(array, length);

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

        end = time(NULL);
        printf("总共耗时:%d秒\n", end - begin);
        system("pause");
        return 0;
}

这是之前的源代码,只是交换两个变量值的算法不同,产生的结果大相径庭
// p[i] += p[k];
                        // p[k] = p[i] - p[k];
                        // p[i] = p[i] - p[k]; 


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

最佳答案
2021-4-14 09:04:03
你如果真的想不消耗额外空间交换的话  加个条件
void bogo_sort(int* p, int len)
{
    int flag = 0;
    int temp;
    srand(time(NULL));
    while (1)
    {
        for (int i = 0, k; i < len; i++)
        {
            k = rand() % len;

            if (k == i)
                continue;
            /*temp = p[k]
            p[k] = p[i];
            p[i] = temp;*/
            p[i] += p[k];
            p[k] = p[i] - p[k];
            p[i] = p[i] - p[k];
        }

        for (int i = 0; i < len - 1; i++)
        {
            if (p[i] > p[i + 1])break;
            if (i == len - 2)flag = 1;
        }
        if (flag)break;
    }
}

本身这种排序就是用来搞笑的
捕获.PNG
捕获1.PNG
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

使用道具 举报

 楼主| 发表于 2021-4-13 22:35:55 | 显示全部楼层
随便来个什么鱼友,我给你最佳解答
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-4-14 09:04:03 | 显示全部楼层    本楼为最佳答案   
你如果真的想不消耗额外空间交换的话  加个条件
void bogo_sort(int* p, int len)
{
    int flag = 0;
    int temp;
    srand(time(NULL));
    while (1)
    {
        for (int i = 0, k; i < len; i++)
        {
            k = rand() % len;

            if (k == i)
                continue;
            /*temp = p[k]
            p[k] = p[i];
            p[i] = temp;*/
            p[i] += p[k];
            p[k] = p[i] - p[k];
            p[i] = p[i] - p[k];
        }

        for (int i = 0; i < len - 1; i++)
        {
            if (p[i] > p[i + 1])break;
            if (i == len - 2)flag = 1;
        }
        if (flag)break;
    }
}

本身这种排序就是用来搞笑的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-9-21 17:31

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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