鱼C论坛

 找回密码
 立即注册
查看: 3235|回复: 4

指针数组之字符串排序问题,怎么有一个一直不对呢?

[复制链接]
发表于 2014-5-30 19:53:32 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 小泉向西流 于 2014-5-30 19:55 编辑
  1. #include<stdio.h>
  2. #include<string.h>

  3. void main()
  4. {
  5.         void sort(char *name[], int n);
  6.         void print(char *name[], int n);
  7.         char *name[]={"Follow me", "BASIC", "Great Wall", "FORTRAN", "EAda", "EA","CBD"};
  8.         int n=7;
  9.         sort(name,n);
  10.         print(name,n);
  11. }

  12. void sort(char *name[], int n)
  13. {
  14.         char *temp;
  15.         int i,j,k;

  16.         for(i=0;i<n-1;i++)
  17.         {
  18.                 k=i;
  19.                 for(j=i+1;j<n;j++)
  20.                 {
  21.                         if( strcmp(name[k],name[j])>0 )
  22.                         {
  23.                                 k=j;
  24.                         }
  25.                         if( k!=i)
  26.                         {
  27.                                 temp=name[i];
  28.                                 name[i]=name[k];
  29.                                 name[k]=temp;
  30.                         }
  31.                 }
  32.         }
  33.         
  34. }

  35. void print(char *name[], int n)
  36. {
  37.         int i;
  38.         for(i=0;i<n;i++)
  39.         {
  40.                 printf("%s\n", name[i]);
  41.         }
  42. }

复制代码


参见视频 《小甲鱼 C语言 (新版)》 第八章08集 , 总第048集。
讲的是指针数组的运用。

题目, 将若干字符串按字母顺序(由小到大)输出。
但实验结果一直不对。

QQ截图20140530195144.png

字符串  “CBD” 的位置不对,  其他几个又是按顺序排列输出的。 不知道为什么,求解。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2014-5-30 20:19:49 | 显示全部楼层
额。。你的排序算法有问题。。。我修改了一下
  1. #include<stdio.h>
  2. #include<string.h>

  3. int main()
  4. {
  5.         void sort(char *name[], int n);
  6.         void print(char *name[], int n);
  7.         char *name[]={"Follow me", "BASIC", "Great Wall", "FORTRAN", "EAda", "EA","CBD"};
  8.         int n=7;
  9.         sort(name,n);
  10.         print(name,n);
  11.         return 0;
  12. }

  13. void sort(char *name[], int n)
  14. {
  15.         char *temp;
  16.         int i,j,k;

  17.         for(i=n-1;i>=0;i--)
  18.         {
  19.                 //k=i;
  20.                 for(j=0;j<i;j++)
  21.                 {
  22.                     /*    if( strcmp(name[k],name[j])>0 )
  23.                         {
  24.                                 k=j;
  25.                         }
  26.                         if( k!=i)       ///////
  27.                         {
  28.                                 temp=name[i];
  29.                                 name[i]=name[k];
  30.                                 name[k]=temp;
  31.                                 
  32.                         }
  33.                     */
  34.                    if( strcmp(name[j],name[i])>0 )
  35.                    {
  36.                            temp=name[i];
  37.                     name[i]=name[j];
  38.                     name[j]=temp;
  39.                    }
  40.                 }
  41.         }
  42.         
  43. }

  44. void print(char *name[], int n)
  45. {
  46.         int i;
  47.         for(i=0;i<n;i++)
  48.         {
  49.                 printf("%s\n", name[i]);
  50.         }
  51. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-5-30 21:08:17 | 显示全部楼层
  1. #include<stdio.h>
  2. #include<string.h>

  3. void main()
  4. {
  5.         void sort(char *name[], int n);
  6.         void print(char *name[], int n);
  7.         char *name[]={"Follow me", "BASIC", "Great Wall", "FORTRAN", "EAda", "EA","CBD"};
  8.         int n=7;
  9.         sort(name,n);
  10.         print(name,n);
  11. }

  12. void sort(char *name[], int n)
  13. {
  14.         char *temp;
  15.         int i,j;

  16.         for(i=0;i<n-1;i++)
  17.         {
  18.                 for(j=i+1;j<n;j++)
  19.                 {
  20.                         if( strcmp(name[i],name[j])>0 )
  21.                         {
  22.                             temp=name[i];
  23.                                 name[i]=name[j];
  24.                                 name[j]=temp;
  25.                         }
  26.                 }
  27.         }
  28.        
  29. }

  30. void print(char *name[], int n)
  31. {
  32.         int i;
  33.         for(i=0;i<n;i++)
  34.         {
  35.                 printf("%s\n", name[i]);
  36.         }
  37. }
复制代码


QQ截图20140530210558.png

加入了K, 为什么就不对呢?


小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-5-30 21:10:21 | 显示全部楼层

两个for循环的思路没有错,如3楼

但为什么加入了一个 K  的判断, 整体就不对呢
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-5-30 21:20:49 | 显示全部楼层
小泉向西流 发表于 2014-5-30 21:10
两个for循环的思路没有错,如3楼

但为什么加入了一个 K  的判断, 整体就不对呢

额。。。最开始的那个code,若某一次改变了k的值,则回一直进入if( k != i)这个判断里。。。比如说i=0时,j=1就改变k的值,让k=1,则一直进入if(k!= i)的判断体中,每次都要替换一次name[0]和name[k],恩,i=0时,k的最后改变值是6,则name[0]和name[6]替换,所以CBD会在第一个。。。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-7-12 19:52

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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