注册 登录
编程论坛 C语言论坛

选择排序中交换数据的不同方式出现的不同结果求分析

飞天大烧卖 发布于 2020-04-05 12:21, 1690 次点击
只有本站会员才能查看附件,请 登录

//选择排序,升序
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]);
    }
}
9 回复
#2
飞天大烧卖2020-04-05 13:56
图中的1,2,3,分别表示代码不更改的情况,代码去掉变量t的情况,用变量t来交换数据的情况
#3
wmf20142020-04-05 14:42
这要看编译器是如何在栈中组织临时变量的,大部分编译器会按照你定义的变量顺序从栈底到栈顶安排存储空间,所以按照你的定义顺序,你的变量在栈中顺序为: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使用的编译器不是按照你定义的顺序组织变量,一般会先组织构造类型,再组织常规类型。
#4
lin51616782020-04-05 17:07
mim 是最小值下标
你不能吧min当交换变量使用
搞清楚每个变量的作用
至于出现错误结果
数组越界不值得讨论
#5
飞天大烧卖2020-04-05 18:00
回复 3楼 wmf2014

vs2013编译器好像在栈区把构造类型给单独分开了,是这样吗
#6
wmf20142020-04-05 22:52
回复 5楼 飞天大烧卖
vs2013不清楚,我现在用的vs2017是这样的。
楼主有兴趣探索变量内存存储方式对加深理解是有帮助的,数组溢出大多数教科书是要求避免的,但如果是做数据安全或者做外挂,合理利用溢出也是手段之一。2005年有一期数据安全竞赛的题目是“如何不使用&*运算强制转换一个浮点数并按字节访问”,大多数答题者是用union方式,只能得一半分数,得满分的就是用cahr数组溢出。
#7
forever742020-04-06 12:48
我还是觉得跟小学生探讨国际金融形势容易把天聊死。
#8
叶纤2020-04-06 15:02
我原来是不知道什么是选择排序的,看了会明白了
这不就是找最小桶的位置,然后和第n桶进行互换吗?
min里装的是最小桶的下标,然后比较最小桶是否和你想换的第n桶位置一样
如果一样,就不用换,如果不一样就换,t只是临时的桶装a i,防止被别的桶污染的
#9
叶纤2020-04-06 15:08
额,我一排序就会把数据想成各色的桶,你就把桶当成数据吧
#10
飞天大烧卖2020-04-06 23:09
回复 7楼 forever74
扎心了
1