标题:选择排序中交换数据的不同方式出现的不同结果求分析
只看楼主
飞天大烧卖
Rank: 2
等 级:论坛游民
帖 子:45
专家分:27
注 册:2020-3-26
结帖率:100%
已结贴  问题点数:20 回复次数:9 
选择排序中交换数据的不同方式出现的不同结果求分析

//选择排序,升序
void main()
{
    int i,min,j,t;
    int a[5]={5,3,4,21,2};
    for(i=0;i<4;i++)
    {
        min=i;//默认此时的a[i]最小
        for(j=i+1;j<5;j++)
        {
            if(a[min]>a[j])
            {
                min=j;
            }
        }
        if(min!=i)//找到了可以交换的数
        {
            min=a[i];//无t是5,21,2,3,4;有t是-85899346021234;用t来交换是234521
            a[i]=a[min];
            a[min]=min;
        }
    }
    for(i=0;i<5;i++)
    {
        printf("%d,",a[i]);
    }
}
搜索更多相关主题的帖子: 交换 选择排序 for 不同 min 
2020-04-05 12:21
飞天大烧卖
Rank: 2
等 级:论坛游民
帖 子:45
专家分:27
注 册:2020-3-26
得分:0 
图中的1,2,3,分别表示代码不更改的情况,代码去掉变量t的情况,用变量t来交换数据的情况
2020-04-05 13:56
wmf2014
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:216
帖 子:2039
专家分:11273
注 册:2014-12-6
得分:10 
这要看编译器是如何在栈中组织临时变量的,大部分编译器会按照你定义的变量顺序从栈底到栈顶安排存储空间,所以按照你的定义顺序,你的变量在栈中顺序为:a[0],a[1],a[2],a[3],a[4],t,j,min,i,在t未删除的情况下,初始值是0xCCCCCCCC,即十进制有符号数-858993460,你第一次搜索时,i=0,a[0]=5,min=a[i]=5,接下来a[i]=a[min]执行的是a[0]=a[5],a[5]不在数组中,正是t所在的位置,所以就出现1结果,删除t后,溢出到j的位置,j此时的值是5,所以就出现2的结果,3是正确代码得到的正确结果。
vs2017使用的编译器不是按照你定义的顺序组织变量,一般会先组织构造类型,再组织常规类型。

能编个毛线衣吗?
2020-04-05 14:42
lin5161678
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:45
帖 子:1136
专家分:3729
注 册:2011-12-3
得分:10 
mim 是最小值下标
你不能吧min当交换变量使用
搞清楚每个变量的作用
至于出现错误结果
数组越界不值得讨论

https://zh.
2020-04-05 17:07
飞天大烧卖
Rank: 2
等 级:论坛游民
帖 子:45
专家分:27
注 册:2020-3-26
得分:0 
回复 3楼 wmf2014

vs2013编译器好像在栈区把构造类型给单独分开了,是这样吗
2020-04-05 18:00
wmf2014
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:216
帖 子:2039
专家分:11273
注 册:2014-12-6
得分:0 
回复 5楼 飞天大烧卖
vs2013不清楚,我现在用的vs2017是这样的。
楼主有兴趣探索变量内存存储方式对加深理解是有帮助的,数组溢出大多数教科书是要求避免的,但如果是做数据安全或者做外挂,合理利用溢出也是手段之一。2005年有一期数据安全竞赛的题目是“如何不使用&*运算强制转换一个浮点数并按字节访问”,大多数答题者是用union方式,只能得一半分数,得满分的就是用cahr数组溢出。

能编个毛线衣吗?
2020-04-05 22:52
forever74
Rank: 12Rank: 12Rank: 12
来 自:CC
等 级:贵宾
威 望:49
帖 子:1636
专家分:3940
注 册:2007-12-27
得分:0 
我还是觉得跟小学生探讨国际金融形势容易把天聊死。

对宇宙最严谨的描述应该就是宇宙其实是不严谨的
2020-04-06 12:48
叶纤
Rank: 8Rank: 8
等 级:禁止访问
威 望:1
帖 子:658
专家分:848
注 册:2019-11-22
得分:0 
我原来是不知道什么是选择排序的,看了会明白了
这不就是找最小桶的位置,然后和第n桶进行互换吗?
min里装的是最小桶的下标,然后比较最小桶是否和你想换的第n桶位置一样
如果一样,就不用换,如果不一样就换,t只是临时的桶装a i,防止被别的桶污染的

把学习时间浪费在混坛上是傻瓜行为,更何况自己的水平连一两都没到。
2020-04-06 15:02
叶纤
Rank: 8Rank: 8
等 级:禁止访问
威 望:1
帖 子:658
专家分:848
注 册:2019-11-22
得分:0 
额,我一排序就会把数据想成各色的桶,你就把桶当成数据吧

把学习时间浪费在混坛上是傻瓜行为,更何况自己的水平连一两都没到。
2020-04-06 15:08
飞天大烧卖
Rank: 2
等 级:论坛游民
帖 子:45
专家分:27
注 册:2020-3-26
得分:0 
回复 7楼 forever74
扎心了
2020-04-06 23:09



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-500868-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.499537 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved