A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© timehzy 中级黑马   /  2015-6-25 23:15  /  1027 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文


看了视频教程关于选择排序的部分,我写了一个跟老师稍有区别的代码
  1. #include <stdio.h>

  2. int main(int argc, const char * argv[]) {
  3.     int a[5]={3,11,2,123,22},min;
  4.    
  5.     for (int i=0; i<5; i++) {
  6.         printf("%d\t",a[i]);
  7.     }
  8.     printf("\n");
  9.     for(int i=0;i<4;i++){
  10.         min=a[i];//把要比较的数赋值给min
  11.         for(int j=i+1;j<5;j++){
  12.             if(min>a[j]){
  13.                 min=a[j];//如果被比较的数比min小就把这个数赋给min
  14.             }
  15.         }
  16.         a[i]=min;//把min赋给最前面的元素
  17.     }
  18.    
  19.     for (int i=0; i<5; i++) {
  20.         printf("%d\t",a[i]);
  21.     }
  22.    
  23.     return 0;
  24. }
复制代码
请问为什么这样打印的结果是:
3        11        2        123        22       
2        2        2        22        22       
排序后的数字为什么不对了?

6 个回复

倒序浏览
没人?:'(
回复 使用道具 举报
本帖最后由 丁铭检 于 2015-6-26 11:02 编辑

这个东西起始你可以一步步的推,然后你就自己懂了。。还有的是你有没有发现你的代码中用的是替换而不是交换。。

评分

参与人数 1黑马币 +3 收起 理由
timehzy + 3 谢谢~

查看全部评分

回复 使用道具 举报
goldboy 来自手机 中级黑马 2015-6-26 11:33:56
板凳
首先min=a是有问题的,min是int类型,而a是一个指针,应该是min=a[0];
然后你只做了一轮选择,只把最小的数排到了最前面,第二小的还没有排吧
回复 使用道具 举报
丁铭检 发表于 2015-6-26 10:59
这个东西起始你可以一步步的推,然后你就自己懂了。。还有的是你有没有发现你的代码中用的是替换而不是交换 ...

嗯嗯,谢谢,刚刚又看了一下,明白了,虽然把比较后多最小值赋给min了,但是数组的顺序没变
回复 使用道具 举报
goldboy 发表于 2015-6-26 11:33
首先min=a是有问题的,min是int类型,而a是一个指针,应该是min=a[0];
然后你只做了一轮选择,只把最小的 ...

谢谢,现在明白了:loveliness:
回复 使用道具 举报
王亚征 发表于 2015-6-27 00:34
应该是作用域混乱,大括号加错了

不是的。是比较的时候的逻辑错误。作用域除了用于for循环的i、j都是全局变量哦
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马