C语言qsort函数用法(个人笔记)

排序方法

排序方法有很多种:快速排序,冒泡排序,选择排序,归并排序等。其中快速排序是一种比较好的排序算法。因为他速度快,所以在库里面实现了这个算法。也就是qsort函数(全称quicksort)。他是ANSI C标准库中提供的,其声明在stdlib.h文件中,是根据二分法写的,其时间复杂度为n*log(n)

功能:使用快速排序例程进行排序
头文件:stdlib.h
用法:void qsort(void* base,size_t num,size_t width,int(__cdecl*compare)(const void*,const void*));
参数:1 待排序数组,排序之后的结果仍放在这个数组中
   2 数组中待排序元素数量
   3 各元素的占用空间大小(单位为字节)
   4 指向函数的指针,用于确定排序的顺序(需要用户自定义一个比较函数)
qsort函数要求提供一个自己定义的比较函数。 比较函数使得qsort通用性更好,有了比较函数qsort可以实现对数组,字符串,结构体等结构进行升序或降序排序。

如比较函数int cmpare(const void *a,const void *b)中有两个元素作为参数(参数的格式不能变),返回比较函数cmpare的作用就是给qsort指明元素的大小是怎么比较的。

对int型数组排序

int num[100];
int cmpare(const void* a,const void* b)//参数格式固定
{
	int* a=(int*)a;//强制类型转换
	int* b=(int*)b;
	return *a-*b;
}
qsort(num,100,sizeof(num[0]),cmpare);

可见,参数列表是两个空指针,现在他要去指向你的数组元素。所以转换为你当前的类型,然后取值。默认升序排列(从小到大),如果想降序排列返回*b-*a即可。

对char型数组排序

char word[100];
int cmpare(const void* a,const void* b)//参数格式固定
{
	char* a=(char*)a;//强制类型转换
	char* b=(char*)b;
	return *a-*b;
}
qsort(word,100,sizeof(word[0]),cmpare));

对double型数组排序

double in[100];
int cmp_double(const void* _a , const void* _b)//参数格式固定
{
    double* a = (double*)_a;//强制类型转换
    double* b = (double*)_b;
    return *a > *b ? 1 : -1;//特别注意,如果大于返回1,小于返回-1
}
qsort(in,100,sizeof(in[0]),cmp_double);

在对浮点或者double型的一定要用三目运算符,因为要是使用像整型那样相减的话,如果是两个很接近的数则可能返回一个很小的小数(大于-1,小于1),而cmp的返回值是int型,因此会将这个小数返回0,系统认为是相等,失去了本来存在的大小关系

对字符串进行排序

char word[100][10];
int cmp_string(const void* _a , const void* _b)//参数格式固定
{
    char* a = (char*)_a;//强制类型转换
    char* b = (char*)_b;
    return strcmp(a,b);
}
qsort(word,100,sizeof(word[0]),cmp_string); 

strcmp(s1,s2)为字符串比较函数,比较的是从字符串的第一个字符开始比较他的ASCLL码值,跟字符串的长度无关。
当s1 > s2 时,返回值 > 0
当s1 = s2 时,返回值 = 0
当s1 < s2时,返回值 < 0
特别注意:strcmp(const char *s1,const char * s2)这里面只能比较字符串,不能比较数字等其他形式的参数

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值