C语言:对字符串快速排序

快速排序

先看一下对数字怎么快速排序
写一下过程

void quick(int num[],int start, int finish)//传入数组,开始和结尾的数组下标
{
    if(start<finish)
    {
        int i=start,j=finish;
        int x=num[start];//设置基数,也就是num[0],把值储存在x中
        while(i<j)
        {
            while(i<j&&num[j]>x)//从右向左遍历数组,如果发现比基数小的就把他放到基数位置
                j--;
            if(i<j)
            {
                num[i]=num[j];//放到基数位置后,j的位置就空了
                i++;//i向后走一个(原来i的位置储存了数num[j])
            }

            while(i<j&&num[i]<x)//同样的道理,从左向右遍历数组,如果发现比基数大的就把他放到上面空出来的j的位置
                i++;
            if(i<j)
            {
                num[j]=num[i];
                j--;//j向前走一个(原来j的位置储存了数num[i])
            }
        }
        num[i]=x;//出循环的时候是i==j,最后把基数放到此位置,就此实现了基数左边比他小,基数右边比他大的结果了
        quick(num,start,i-1);//在i的左边再次调用quick函数
        quick(num,i+1,finish);//在i的右端再次调用quick函数
    }
    printf("  %d %d  ",start,finish);
}
int main()
{
    int num[]={9,4,5,3,2,76,45,4,2,2};
    int start=0;
    int finish=sizeof(num)/sizeof(int)-1;//算一下最后一位对应的下标
    quick(num,start,finish);
    for(int i=0;i<=finish;i++)
        printf("%d ",*(num+i));
    return 0;
}

下面图解了一下快速排序的全过程,因为我看的图解都只有一步,后面都省略了,所以就自己画了个小图解
在这里插入图片描述在这里插入图片描述在这里插入图片描述
运行结果:
在这里插入图片描述
理解了快速排序,那么对字符串的快速排序也就容易了
例如对几个国家名快速排序

#include <stdio.h>
#include <malloc.h>
#include <string.h>
/*形参名都没变直接拿来用了,下面有注释的是改过的*/
void quick(char *num[],int start, int finish)//传的是一维数组指针
{

    if(start<finish)
    {
        int i=start,j=finish;
        char *x=num[start];//x变成字符串
        while(i<j)
        {
            while(i<j&&strcmp(num[j],x)>0)//比较字符串用strcmp()函数
                j--;
            if(i<j)
            {
                num[i]=num[j];
                i++;
            }

            while(i<j&&strcmp(num[i],x)<0)//
                i++;
            if(i<j)
            {
                num[j]=num[i];
                j--;
            }
        }
        num[i]=x;
        quick(num,start,i-1);
        quick(num,i+1,finish);
    }
}
int main()
{
    char* str[8]={"CHINA","JAPAN","KOBEA","USA","RUSSIA","UK","FRANCE","AUS"};//设置个一维数组的指针
    int i;
    printf("排序前:");
    for(i=0;i<8;i++)
        printf("%s " ,str[i]);//字符串的出
    putchar('\n');
    quick(str,0,7);//调用,不要下标越位
    printf("排序后;");
    for(i=0;i<8;i++)
        printf("%s ",str[i]);
    return 0;
}

结果如下:
在这里插入图片描述
快速排序参考:https://www.runoob.com/w3cnote/quick-sort.html

  • 3
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
快速排序是一种常用的排序算法,它的基本思想是通过一趟排序将待排记录分隔成独立的两部分,其中一部分记录的关键字均比另一部分记录的关键字小,然后再分别对这两部分记录继续进行排序,以达到整个序列有序的目的。对于C语言中的字符串快速排序,可以使用strcmp()函数来比较字符串的大小,具体实现方法如下: 1. 首先定义一个一维数组的指针,用来存储需要排序的字符串。 2. 定义一个quick()函数,传入的参数为字符串数组指针、开始下标和结束下标。 3. 在quick()函数中,设置基准数x为num[start],即第一个字符串。 4. 从右向左遍历数组,如果发现比基准数小的就把他放到基准数位置,然后i向后走一个;从左向右遍历数组,如果发现比基准数大的就把他放到上面空出来的j的位置,然后j向前走一个。 5. 当i==j时,把基准数放到此位置,就此实现了基准数左边比他小,基准数右边比他大的结果了。 6. 在i的左边再次调用quick()函数,在i的右端再次调用quick()函数。 7. 最后输出排序后的字符串数组。 下面是一个示例代码: ``` void quick(char *num[],int start, int finish)//传的是一维数组指针 { if(start<finish) { int i=start,j=finish; char *x=num[start];//x变成字符串 while(i<j) { while(i<j&&strcmp(num[j],x)>0)//比较字符串用strcmp()函数 j--; if(i<j) { num[i]=num[j]; i++; } while(i<j&&strcmp(num[i],x)<0)// i++; i++; if(i<j) { num[j]=num[i]; j--; } } num[i]=x; quick(num,start,i-1); quick(num,i+1,finish); } } int main() { char* str[8]={"CHINA","JAPAN","KOBEA","USA","RUSSIA","UK","FRANCE","AUS"};//设置个一维数组的指针 int i; printf("排序前:"); for(i=0;i<8;i++) printf("%s " ,str[i]);//字符串的出 putchar('\n'); quick(str,0,7);//调用,不要下标越位 printf("排序后;"); for(i=0;i<8;i++) printf("%s ",str[i]); return 0; } ```
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值