C语言排序qsort函数
0 前言
- 最近刷题经常用到排序,发现了很好用的qsort函数,只是在具体用法上可能会有一些复杂,于是写博客记录一下
1 具体用法
1.1 头文件
- qsort函数是包含在stdlib.h头文件中的函数,需要在编写程序前进行声明:
#include <stdlib.h>
1.2 参数
-
qsort函数包含四个参数,分别是:
- 数组名
- 元素个数(从前往后计算)
- 数组元素所占字节(int,double,char等所占字节)
- 排序原则(递增,递减,奇偶交叉等)
-
排序原则需要单独定义一个函数,需要注意的是,定义的函数形参固定形式:
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;
}