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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2013-12-8 00:32:28 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
5啊哈币
main()
{ char a[]="clanguage",t;
  int i,j,k;     k=strlen(a);
  for(i=0;i<=k-1;j+=1)
    for(j=i+1;j<k;i+=1)
      if(a[i]>a[j])
       {t=a[i];a[i]=a[j];a[j]=t;}
  puts(a);
  printf("\n");  
}

沙发
发表于 2013-12-8 00:51:19 | 只看该作者
bubble sort和selection sort,你想写的是哪个?
板凳
 楼主| 发表于 2013-12-8 01:00:45 | 只看该作者
selection sort
地板
发表于 2013-12-8 01:02:32 | 只看该作者
本帖最后由 河蟹 于 2013-12-8 01:06 编辑

楼主重复发帖了,还有问题出在循环中 i 和 j
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. main()
  4. { char a[]="clanguage",t;
  5.   int i,j,k;     
  6.   k=strlen(a);
  7.   for(i=0;i<=k-1;i++)
  8.   {
  9.      for(j=i+1;j<k;j++)
  10.         if(a[i]>a[j])
  11.         {
  12.           t=a[i];
  13.           a[i]=a[j];
  14.           a[j]=t;
  15.         }
  16.   }
  17.   printf("数组a内字符排序:");
  18.   puts(a);
  19.   printf("k=%d",k);
  20.   printf("\n");  
  21.   system("pause");

  22. }
复制代码
5#
发表于 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. }
复制代码
6#
 楼主| 发表于 2013-12-8 12:28:18 | 只看该作者
那冒泡法是怎样呢?
7#
 楼主| 发表于 2013-12-8 12:44:05 | 只看该作者
这个程序不是我写的,是一道习题。我觉得运行结果是从小到大排序,但答案是alancuegg。
8#
发表于 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,于是停不下来,一般的结果就是访问了不该访问的内存造成崩溃
9#
发表于 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. }
复制代码
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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