C语言 字符串指针排序函数

下面这个是用冒泡排序,运行错误

#include<stdio.h>
#include<string.h>
#define N 5
int main()
{
  char ptr[N][80]={ "how ","are ","you ","i","fine" };
  char *p[N];
  char *temp;
  int i,j;
  for(i=0;i<N;i++)  p[i]=ptr[i];

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

下面这个是用选择排序,运行结果却是正确的

#include<stdio.h>
#include<string.h>
#define N 5
int main()
{
  char ptr[N][80]={ "how ","are ","you ","i","fine" };
  char *p[N];
  char *temp;
  int i,j;
  for(i=0;i<N;i++)  p[i]=ptr[i];

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

下面这个没有用指针,直接改变原字符串数组,是用冒泡排序
也是正确的

#include<stdio.h>
#include<string.h>
#define N 5
int main()
{
  char ptr[N][80]={ "how ","are ","you ","i","fine" };
  char temp[80];
  int i,j;
   for(i=0;i<N-1;i++)
      for(j=0;j<N-i;j++)
          if(strcmp(ptr[j],ptr[j+1])>0)
          {
            strcpy(temp,ptr[j]);
            strcpy(ptr[j],ptr[j+1]);
            strcpy(ptr[j+1],temp);
          }
  for(i=0;i<N;i++)
      puts(ptr[i]);
}


求解答,万分感谢!

3个回答

第一个程序


#include<stdio.h>
#include<string.h>
#define N 5
int main()
{
  char ptr[N][80]={ "how ","are ","you ","i","fine" };
  char *p[N];
  char *temp;
  int i,j;
  for(i=0;i<N;i++)  
      p[i]=ptr[i];

   for(i=0;i<N-1;i++)
      for(j=i;j<N-1;j++)
          if(strcmp(p[j],p[j+1])>0)
          {
            temp=p[j];
            p[j]=p[j+1];
            p[j+1]=temp;
          }
  for(i=0;i<N;i++)
      puts(p[i]);
}
enjoy6577
enjoy6577 感谢! 对 j 循环的时候限制错了,导致多了一个
大约 5 年之前 回复

第二个程序,你不是选择排序,选择排序写法如下

 #include<stdio.h>
#include<string.h>
#define N 5
int main()
{
  char ptr[N][80]={ "how ","are ","you ","i","fine" };
  char *p[N];
  char *temp;
  int i,j;
  for(i=0;i<N;i++)  
      p[i]=ptr[i];

   for(i=0;i<N;i++)
   {
    int minidx = i;
    for (j = i+1; j < N; j++)
    {
        if(strcmp(p[minidx],p[j])>0)
        {
            minidx=j;
        }
        temp=p[i];
        p[i]=p[minidx];
        p[minidx]=temp;
    }
   }
  for(i=0;i<N;i++)
      puts(p[i]);
}
caozhy
贵阳老马马善福专业维修游泳池堵漏防水工程 回复yyfbuzhidao: 对不起,是我错了。应该放在循环外面
大约 5 年之前 回复
yyfbuzhidao
yyfbuzhidao 你把代码复制跑一下就知道了,看看你的输出是什么
大约 5 年之前 回复
yyfbuzhidao
yyfbuzhidao 你应该好好看看书吧,这么明显的错误
大约 5 年之前 回复
caozhy
贵阳老马马善福专业维修游泳池堵漏防水工程 回复yyfbuzhidao: 你再好好看看书
大约 5 年之前 回复
yyfbuzhidao
yyfbuzhidao 意图:选出后面中最小的那个下标,在与之比对,看谁更小,选择排序的优势之一就是少了很多交换值得操作
大约 5 年之前 回复
yyfbuzhidao
yyfbuzhidao 没有啊,交换你写在了for (j = i+1; j < N; j++)这个循环体内。当然不判断i != minidx是可以,这个需要权衡(判断了可能会少几步赋值操作,但是多了一个if语句),不过判断了更符合选择排序的
大约 5 年之前 回复
caozhy
贵阳老马马善福专业维修游泳池堵漏防水工程 回复yyfbuzhidao: 另外我的交换是写在外部的。你再看下。
大约 5 年之前 回复
caozhy
贵阳老马马善福专业维修游泳池堵漏防水工程 回复yyfbuzhidao: 不判断也可以
大约 5 年之前 回复
yyfbuzhidao
yyfbuzhidao 有错,交换应该放到外部循环,还要判断 i != minidx
大约 5 年之前 回复
yyfbuzhidao
yyfbuzhidao temp=p[i]; p[i]=p[minidx]; p[minidx]=temp;
大约 5 年之前 回复

各种错
第一段:i=0改为i=1。原因:当i = 0时,j<N-i,j的最大值可以是4,p[j+1])即为p[5],指针数组越界了,p[5]是一个未初始化的地址
第二段:这种选择排序不好,多次赋值,不多说
第三段:其实也是错的,原因和1差不多,不过ptr[5]碰巧是有效地址,但是ptr[5]得内容绝对是乱码

enjoy6577
enjoy6577 感谢!
大约 5 年之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问
相关内容推荐