找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1014|回复: 2
打印 上一主题 下一主题
收起左侧

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

[复制链接]
跳转到指定楼层
楼主
  1. //选择排序,升序
  2. void main()
  3. {
  4.     int i,min,j,t;
  5.     int a[5]={5,3,4,21,2};
  6.     for(i=0;i<4;i++)
  7.     {
  8.         min=i;//默认此时的a[i]最小
  9.         for(j=i+1;j<5;j++)
  10.         {
  11.             if(a[min]>a[j])
  12.             {
  13.                 min=j;
  14.             }
  15.         }
  16.         if(min!=i)//找到了可以交换的数
  17.         {
  18.             min=a[i];//无t是5,21,2,3,4;有t是-85899346021234;用t来交换是234521
  19.             a[i]=a[min];
  20.             a[min]=min;
  21.         }
  22.     }
  23.     for(i=0;i<5;i++)
  24.     {
  25.         printf("%d,",a[i]);
  26.     }
  27. }
复制代码

0.png (22.62 KB, 下载次数: 98)

0.png
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:722908 发表于 2020-4-5 16:28 | 只看该作者
想要交换的话要有一个中间量啊,不然a[min]=min的时候min已经是a[i]的指了,-858993460怎么出来的我也不清楚233
回复

使用道具 举报

板凳
ID:272485 发表于 2020-4-5 17:15 | 只看该作者
这要看编译器是如何在栈中组织临时变量的,大部分编译器会按照你定义的变量顺序从栈底到栈顶安排存储空间,所以按照你的定义顺序,你的变量在栈中顺序为: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使用的编译器不是按照你定义的顺序组织变量,一般会先组织构造类型,再组织常规类型。  
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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