c语言选择法排序问题

为什么在排序时,第一个For循环里必须加iPos=i;呢,不加为什么会出现错误?如图,排序出现问题,6不见了。

这个问题可以设想如果数组就是从小到大的,会发生什么情况:如果就是从小到大的数组,if 语句没用了,那么直接执行a[iPos]=a[i], 这就会出现问题了,如果你没 对iPos赋值,那么程序会报错,如果对iPos赋值,那么该赋什么值?毫无疑问是i,如果和i不同,那么意味着每次循环a 数组中iPos处的值都要改变为a[i],而a 就是从小到大的不需要改变,也会出问题。
再看一下你这个程序6为什么没了?
因为你这个数组比较特殊,10到1递减的,所以第1次排序是10和1对换,iPos=9;即1所在的位置。
第2次是9和2对换iPos=8;即2所在的位置
第3次是8和3对换iPos=7;即3所在的位置
第4次是7和4对换iPos=6;即4所在的位置
第5次是6和5对换iPos=5;即5所在的位置
注意在第5次排序之后已经得到从小到大的数组了:1、2、3、4、5、6、7、8、9、10;
正常情况下后面的排序不会影响结果了。
后面的6、7、8、9、10再排序,这就和刚开始说的情况一样了,这些本来就是从小到大的,if语句没用了,那么也就意味着iPos不会改变了,而上面执行到iPos=5,所以后面每次循环执行a[iPos]=a[i],把i 处的值赋给a[iPos],也就是赋给a[5], 而a[5]的值是6,就是说后面每次排序会把6、7、8、9、10替换6最终的结果是a[5]=10,6没了。
所以可以看到如果当前循环i处a[i]就是最小值,是不需要进行替换操作的。但是如果不设置iPos=i,会导致执行a[iPos]=a[i],改变a[iPos]的值。
温馨提示:答案为网友推荐,仅供参考
第1个回答  2017-12-30
如果iTemp不被赋值的话,那下面的if(a[j]<iTemp)肯定会报错啦,你在程序开始的时候初始化ITemp并没有给iTmep赋值哦,本回答被网友采纳
第2个回答  2020-03-26

C语言经典例子之选择法排序

相似回答