lun1ght 2024-03-16 05:27 采纳率: 75%
浏览 3
已结题

为什么从小到大排序是正常的,从大到小就会丢失第0项的地址

为什么如果if(strcmp(p[i],p[j])>0),就是正常从小到大输出的结果,但是如果是if(strcmp(p[i],p[j])<0),那么指针数组name[0]就会丢失,name[1]-name[4]没有丢失正常输出


#include <stdio.h>
#include <string.h>
int main()
{
    void px(char *p[],int n);
    char *name[]={"Follow me","BASIC","Great Wall","FORTRAN","Computer design"};
    px(name,5);
    int i;
    for(i=0;i<5;i++)
        printf("%s\n",name[i]);
    return 0;
}

void px(char *p[],int n)
{
    int i,j;
    char *t;
    for(i=0;i<=n;i++)
    {
        for(j=i+1;j<=n;j++)
        {
            if(strcmp(p[i],p[j])<0)
            {
                t=p[i];
                p[i]=p[j];
                p[j]=t;
            }
        }
    }
}
    

  • 写回答

3条回答 默认 最新

  • 檀越@新空间 2024-03-16 05:27
    关注

    lun1ght 上午好☀️☀️☀️️
    本答案参考ChatGPT-3.5

    问题出现在排序算法的实现上:

    在你的排序算法中,你使用的是冒泡排序的方法,从小到大排序的代码是正确的,但是从大到小排序时出现了问题。

    原因是在内层循环中,你使用的是strcmp(p[i],p[j])<0作为判断条件,这时候每次遇到相邻的元素需要交换位置时,你将较小的元素放在了较大的元素的位置上,这样会导致在后续的循环中会出现指针丢失的问题。

    解决方案:

    1. 在内层循环中,将判断条件改为strcmp(p[i],p[j])>0,这样可以保证按从大到小的顺序进行排序。

      • 修改后的排序算法代码如下所示:

        void px(char *p[],int n) {
            int i,j;
            char *t;
            for(i=0;i<=n;i++)
            {
                for(j=i+1;j<=n;j++)
                {
                    if(strcmp(p[i],p[j])>0)
                    {
                        t=p[i];
                        p[i]=p[j];
                        p[j]=t;
                    }
                }
            }
        }
        
    2. 在调用排序函数时,将数组大小改为n-1,因为数组下标是从0开始的。

      • 修改后的主函数代码如下所示:

        int main() {
            void px(char *p[],int n);
            char *name[]={"Follow me","BASIC","Great Wall","FORTRAN","Computer design"};
            px(name,4);
            int i;
            for(i=0;i<5;i++)
                printf("%s\n",name[i]);
            return 0;
        }
        

    这样修改后,无论是从小到大排序还是从大到小排序都能够正确输出结果,并且不会出现指针丢失的问题。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 3月19日
  • 已采纳回答 3月16日
  • 创建了问题 3月16日