搜索
查看: 1120|回复: 8
打印 上一主题 下一主题

我的理解是把字符从小到大排列,可答案不对,求详细分析

[复制链接]
楼主
发表于 2013-12-8 00:51:19 | 显示全部楼层
bubble sort和selection sort,你想写的是哪个?
沙发
发表于 2013-12-8 01:39:13 | 显示全部楼层
selection sort没必要每次都交换,记住子序中最小字符的位置和最小值就可以了
  1. #include <stdio.h>
  2. #include <string.h>

  3. int main()
  4. {
  5.   char str[] = "clanguage";
  6.   int i, j;
  7.   int limit = strlen(str);
  8.   
  9.   for( i=0; i!=limit-1; ++i){
  10. /*最后一项不用排序,因为把比它小的都移到前面去了,剩下的一定就是最大的*/
  11.     char min = str[i];
  12.     int min_pos = i;
  13. /* 最小值和最小值所在的位置 */
  14.     for( j=i+1; j!=limit; ++j){
  15.       if(str[j] < min){
  16.         min = str[j];
  17.         min_pos = j;
  18. /*如果比最小值还小,更新信息 */
  19.       }
  20.     }
  21.     str[min_pos] = str[i];
  22.     str[i] = min;
  23. /*最后, 把i写到最小值的位置上,再把最小值写到i的位置上,完成交换 */
  24.   }

  25.   puts(str);
  26.   return 0;
  27. }
复制代码
板凳
发表于 2013-12-8 14:25:26 | 显示全部楼层
coco 发表于 2013-12-8 12:44
这个程序不是我写的,是一道习题。我觉得运行结果是从小到大排序,但答案是alancuegg。

如果你没抄错,题目也没印错,代码的行为是未定义的
  1. for(j=i+1;j<k;i+=1)
复制代码
j < k,但是自增的是i,于是停不下来,一般的结果就是访问了不该访问的内存造成崩溃
地板
发表于 2013-12-8 14:55:05 | 显示全部楼层
bubble sort
  1. #include <stdio.h>
  2. #include <string.h>

  3. #define SWAP(a, b) {a ^= b; b ^= a; a ^= b;}
  4. /* xor swapping */
  5. int main()
  6. {
  7.   char str[] = "clanguage";
  8.   int i, j;
  9.   int limit = strlen(str);

  10.   for(i=0; i<limit; ++i){
  11. /* bubble sort每次都扫描未排序好的子序列,然后把最大值换到队尾去 */
  12.     int changed = 0;
  13. /* 记录一次迭代中交换的次数 */
  14.     for(j=0; j<limit-i-1; ++j)
  15.       if(str[j] > str[j+1]){
  16.         SWAP(str[j], str[j+1])
  17.         changed += 1;
  18. /* 如果发现临近的两个值顺序颠倒就交换 */
  19.       }
  20.     if(changed == 0)
  21.       break;
  22. /* 一次迭代中没有发现逆序对,说明已经排序好了 */
  23.   }

  24.   puts(str);
  25.   return 0;
  26. }
复制代码
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

广播台
特别关注
快速回复 返回顶部 返回列表