鱼C论坛

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

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

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

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

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

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

void main()
{
        void sort(char *name[], int n);
        void print(char *name[], int n);
        char *name[]={"Follow me", "BASIC", "Great Wall", "FORTRAN", "EAda", "EA","CBD"};
        int n=7;
        sort(name,n);
        print(name,n);
}

void sort(char *name[], int n)
{
        char *temp;
        int i,j,k;

        for(i=0;i<n-1;i++)
        {
                k=i;
                for(j=i+1;j<n;j++)
                {
                        if( strcmp(name[k],name[j])>0 )
                        {
                                k=j;
                        }
                        if( k!=i)
                        {
                                temp=name[i];
                                name[i]=name[k];
                                name[k]=temp;
                        }
                }
        }
        
}

void print(char *name[], int n)
{
        int i;
        for(i=0;i<n;i++)
        {
                printf("%s\n", name[i]);
        }
}

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

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

QQ截图20140530195144.png

字符串  “CBD” 的位置不对,  其他几个又是按顺序排列输出的。 不知道为什么,求解。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

int main()
{
        void sort(char *name[], int n);
        void print(char *name[], int n);
        char *name[]={"Follow me", "BASIC", "Great Wall", "FORTRAN", "EAda", "EA","CBD"};
        int n=7;
        sort(name,n);
        print(name,n);
        return 0;
}

void sort(char *name[], int n)
{
        char *temp;
        int i,j,k;

        for(i=n-1;i>=0;i--)
        {
                //k=i;
                for(j=0;j<i;j++)
                {
                    /*    if( strcmp(name[k],name[j])>0 )
                        {
                                k=j;
                        }
                        if( k!=i)       ///////
                        {
                                temp=name[i];
                                name[i]=name[k];
                                name[k]=temp;
                                
                        }
                    */
                   if( strcmp(name[j],name[i])>0 ) 
                   {
                           temp=name[i];
                    name[i]=name[j];
                    name[j]=temp;
                   }
                }
        }
        
}

void print(char *name[], int n)
{
        int i;
        for(i=0;i<n;i++)
        {
                printf("%s\n", name[i]);
        }
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

void main()
{
        void sort(char *name[], int n);
        void print(char *name[], int n);
        char *name[]={"Follow me", "BASIC", "Great Wall", "FORTRAN", "EAda", "EA","CBD"};
        int n=7;
        sort(name,n);
        print(name,n);
}

void sort(char *name[], int n)
{
        char *temp;
        int i,j;

        for(i=0;i<n-1;i++)
        {
                for(j=i+1;j<n;j++)
                {
                        if( strcmp(name[i],name[j])>0 )
                        {
                            temp=name[i];
                                name[i]=name[j];
                                name[j]=temp;
                        }
                }
        }
        
}

void print(char *name[], int n)
{
        int i;
        for(i=0;i<n;i++)
        {
                printf("%s\n", name[i]);
        }
}

QQ截图20140530210558.png

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


想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

但为什么加入了一个 K  的判断, 整体就不对呢
想知道小甲鱼最近在做啥?请访问 -> 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会在第一个。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-28 04:06

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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