C语言排序qsort函数

0 前言

  • 最近刷题经常用到排序,发现了很好用的qsort函数,只是在具体用法上可能会有一些复杂,于是写博客记录一下

1 具体用法

1.1 头文件

  • qsort函数是包含在stdlib.h头文件中的函数,需要在编写程序前进行声明:#include <stdlib.h>

1.2 参数

  • qsort函数包含四个参数,分别是:

    1. 数组名
    2. 元素个数(从前往后计算)
    3. 数组元素所占字节(int,double,char等所占字节)
    4. 排序原则(递增,递减,奇偶交叉等)
  • 排序原则需要单独定义一个函数,需要注意的是,定义的函数形参固定形式:const void *a,const void *b,表示a和b的类型是未确定的

1.3 不同类型排序函数

1.3.1 整形

int cmp(const void *a,const void *b) {
	return *(int*)a-*(int*)b;
}

1.3.2 浮点数

int cmp(const void *a,const void *b) {
	return *(double*)a>*(double*)b?1:-1;
}

1.3.3 字符

int cmp(const void *a,const void *b) {
	return *(char*)a-*(char*)b;
}

1.3.4 结构体

struct node{
	int i;
	double j;
	char k;
};
int cmp(const void *a,const void *b) {
	return (*(node*)a).i-(*(node*)b).i;
}

1.3.5 字符串

int cmp(const void * c1,const void * c2){
    return strcmp((char*) c1,(char*) c2);
}

3 用法举例

  • 代码实现后缀子串排序
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define N 100
char res[N];
char dest[N][N];

int cmp_str(const void * c1,const void * c2){
    return strcmp((char*) c1,(char*) c2);
}

int main(void) {
    while(scanf("%s",res) != EOF){
        int n = strlen(res);
        for(int i = 0;i < n; i ++){
            strcpy(dest[i], res + i);
        }
        qsort(dest[0], n, sizeof(dest[0]), cmp_str);
        for(int i = 0;i < n;i ++){
            printf("%s\n",dest[i]);
        }
    }
    return 0;
}
posted @ 2024-01-08 18:02  Weisswire  阅读(38)  评论(0编辑  收藏  举报