对字符串进行排序

给三个字符串,对它们进行排序,之前写过对三个数排序,定义一个中间变量,a,b,c依次比较,如果不是顺序,就用临时变量对它们进行交换。字符串也可以用这样的方法进行排序。

void Sort(const char *a,const char *b,const char *c)//字符串不能被修改,应该用const修饰
{
 const char *tmp;//指针变量,用于交换两个指针,中间变量也不能被随意修改,该加const要加上
 
 if(strcmp(a,b)>0)//字符串比较函数,比较字符串a和b的大小,头文件时string.h
 {
  tmp=a;
  a=b;
  b=tmp;
 }
 if(strcmp(a,c)>0)
 {
  tmp=a;
  a=c;
  c=tmp;
 }
 if(strcmp(b,c)>0)
 {
  tmp=b;
  b=c;
  c=tmp;
 }
 printf("%s %s %s\n",a,b,c);   //此时的a,b,c已经有序了
}

如果是对很多字符串排序呢,上面的程序显然就不合理了,因为需要比较的字符串太多了。这个不好想的话,我们依然可以类比对数字怎样排序,如果很多数字要进行排序,首先把它们放到一个数组里面,然后在进行排序。排序的方法有很多种,下面要说的是冒泡排序(升序)
给出一组数:9  4 2  7 1 
第一次冒泡:4 9  2  7 1
第二次冒泡:4 2  9  7 1 
第三次冒泡 :4 2  7 9 1
第四次冒泡:4  2  7 1 9
经过一轮循环,最大的数就冒到了最底下,最后一个数就有序了,然后下一轮就可以不用遍历它了。可以看出如果有五个数,只需要进行4趟比较,有n个数,要进行 n-1 趟比较。 在第 1 趟比较中,要进行4次两两比较,在第 j 趟中要进行 n-j 次两两比较。

void BubbleSort(int *a,int len)  //冒泡排序,形参是数组的首元素地址和数组长度
{
 for(int i=0;i
 {
  for(int j=0;j
  {
   if(a[j]>a[j+1])  //如果前面的数大于后面的数就交换这两个数
   {
       int tmp=a[j];
       a[j]=a[j+1];
       a[j+1]=tmp;
   }
  }
 }
}
void Show(int *a,int len)  //打印函数,打印出数组现在的数字
{
 for(int i=0;i
 {
  printf("%d ",a[i]);
 }
}

既然可以用数组对数字进行排序,也可以用数组对多个字符串进行排序,数组里面保存的是什么呢?
是字符串首元素的地址,这个数组就是指针数组,类型是char * ,所以这个数组的首元素地址就是 char * * p.
void Sort2(char **p,int len) //参数是指针数组首元素的地址和它的长度
{
 char *tmp;  //定义一个临时的指针变量,用于交换数组元素的内容
 for(int i=0;i
 {
  for(int j=0;j
  {
   if(strcmp(p[j],p[j+1])>0) //字符串比较函数比较大小
   {
    tmp=p[j];
    p[j]=p[j+1];
                p[j+1]=tmp;
      }
     }
 }
}
void Show2(char **p,int len) //打印函数,输出指针数组的内容,参数就是这个指针数组的首元素地址
{
 for(int i=0;i
 {
  printf("%s ",p[i]);
 }
}
写测试用例
int main()
{
 char str1[]="abcd";
 char str2[]="aa";
 char str3[]="gre";
 Sort(str1,str2,str3);
 int a[]={2,5,7,3,6,1};
 Bubble(a,6);
 Show(a,6);
 char *b[]={"hbc","aef","dsk","bc"};
 Sort2(b,4);
 Show2(b,4);
 return 0;
}



  • 7
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值