描述
对数组进行排序。(int、double、string等)
基于二分法,时间复杂度为n*log(n)
头文件
#include <stdlib.h>
原型
void qsort(void *base, size_t nitems, size_t size, int (*compar)(const void *, const void*))
参数解析
base : 第一个元素的指针
nitems : 数组元素总个数
size : 每个元素的大小/字节
compar:用于判定“>”的定义的函数,通过0,-1,1判断升序、降序。默认为升序排序,此处定义什么是“升序”。
返回值
qsort()不返回任何数值。
PS:用于比较的函数是有返回值的,且只能为int类型,用于判断大于、小于的逻辑定义。
实例
int double string等都可以比较,但是由于精度问题导致返回值需要修改为0,-1,1等int类型的返回值。
实例-int、double、char、一维数组等
#include <stdio.h>
#include <stdlib.h>
int fun_cmp(const void *a , const void *b){
return *(int *)a > *(int *)b ? 1 : -1 ;
//return *(double *)a > *(double *)b ? 1 : -1 ;
//return *(char *)a > *(char *)b ? 1 : -1 ;
// etc
}
int main(){
int hand[] = {1,4,2,5,7,3,8,6,2,0};
int hand_size = sizeof(hand) / sizeof(hand[0]);
int i = 0;
printf("before : ");
for(i=0;i<hand_size;i++){
printf("%d,",hand[i]);
}
qsort(hand , hand_size , sizeof(int) , fun_cmp);
printf("\nafter : ");
for(i=0;i<hand_size;i++){
printf("%d,",hand[i]);
}
printf("\n");
return 0;
}
before : 1,4,2,5,7,3,8,6,2,0,
after : 0,1,2,2,3,4,5,6,7,8,
实例-string
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int fun_cmp(const void *a , const void *b){
return strcmp( *(char * const *) a , *(char * const *) b );
}
int main(){
//ISO C++11 does not allow conversion from string literal to 'char *'
char *hand[] = {"str_3","str_3","str_1","str_9","str_5","str_4"};
// char hand[][] =......
int hand_size = sizeof(hand) / sizeof(hand[0]);
int i = 0;
printf("before : ");
for(i=0;i<hand_size;i++){
printf("%s,",hand[i]);
}
qsort(hand , hand_size , sizeof(char *) , fun_cmp);
printf("\nafter : ");
for(i=0;i<hand_size;i++){
printf("%s,",hand[i]);
}
printf("\n");
return 0;
}
before : str_3,str_3,str_1,str_9,str_5,str_4,
after : str_1,str_3,str_3,str_4,str_5,str_9,