C语⾔的排序函数qsort()详解
c语言char的用法⼀.qsort()函数的⽤法及使⽤说明:
⽬录
void qsort( void *base, size_t num, size_t width, int (__cdecl *compare )(const void *elem1, const void *elem2 ) );是在C语⾔中的排序函数其中的参数如下:
第⼀个参数表⽰需要排序的是哪个数组,第⼆个参数是排序的个数,第三个参数是每个排序的数的字节⼤⼩,注意:最后⼀个参数是进⾏排序的规则,这个规则需要⾃⼰去实现,实际上是⼀个⽐较⼤⼩的函数,对于不同的数据类型需要将参数值转化为不同的参数,⼀般常⽤的写法如下:
int compare(const void* a,const void* b){
return *(type*)a-*(type*)b;//升序
//return *(type*)a-*(type*)b;//降序
}
其中type*是将a强转为对应的指针类型,然后再进⾏解引⽤得到a的值,同理b也如此。对于该种排序为升序排序,注释后的为降序排序⼆.使⽤qsort()函数来求关于各种类型的(降序)排序
1.int类型的数组进⾏排序
compare函数返回值有三种结果⼤于0,等于0,⼩于0.
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
//⽐较函数
int compare(const void* a, const void* b){
return (*(int*)a) - (*(int*)b);//升序排序
}
//打印数组
void print(int* arr,int len){
for (int i = 0; i < len; i++)
{
printf("%d ",arr[i]);
}
printf("\n");
}
int main(){
int arr[] = {12,10,11,8,3,9,0};
int len = sizeof(arr) / sizeof(arr[0]);//数组长度
qsort(arr,len,sizeof(int),compare);
print(arr,len);
return 0;
}
2.char类型的数组进⾏排序
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
int compare(const void* a, const void* b){
return (*(char*)a) - (*(char*)b);//降序排序
}
//打印数组
void print(char* arr, int len){
for (int i = 0; i < len; i++)
{
printf("%c ", arr[i]);
}
printf("\n");
}
int main(){
char arr[] = {'d','a','r','x','g','e','x','g','a','w'};
int len = sizeof(arr) / sizeof(arr[0]);//数组长度
qsort(arr,len,sizeof(char),compare);
print(arr, len);
return 0;
}
3.double类型的数组排序(与前两个有区别)
因为doble是浮点类型,是⼩数,所以只有⼤于0和⼩于0两种结果
//double类型排序
int compare(const void* a, const void* b){
return (*(double*)a) > (*(double*)b);//升序排序
}
//打印数组
void print(double* arr, int len){
for (int i = 0; i < len; i++)
{
printf("%lf ", arr[i]);
}
printf("\n");
}
int main(){
double arr[] = {1.2,5.42,0.3,3.6,5.8};
int len = sizeof(arr) / sizeof(arr[0]);//数组长度
qsort(arr,len,sizeof(double),compare);
print(arr, len);
return 0;
}
4.结构体进⾏排序(按照需要⽤什么进⾏排序,具体情况具体分析)
例如:按照学⽣的编号进⾏排序,开始存在数组中的编号为2,1,3.排序后的编号为1,2,3
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef struct Student{
char name[10];
int num;
}student;
//结构体类型排序
int compare(const void* a, const void* b){
return ((student*)a)->num - ((student*)b)->num;//升序排序
}
//打印数组
void print(student* arr, int len){
for (int i = 0; i < len; i++)
{
printf("%s=%d ", arr+i,arr[i].num);
printf("\n");
}
}
int main(){
student arr[3];
strcpy(&arr[0], "Mary");//这⾥使⽤字符串拷贝是因为只能访问到姓名地址,⽆法直接更改
arr[0].num = 2;
strcpy(&arr[1], "John");
arr[1].num = 1;
strcpy(&arr[2], "Ming");
arr[2].num = 3;
int len = sizeof(arr) / sizeof(arr[0]);//数组长度
qsort(arr,len,sizeof(student),compare);
print(arr, len);
return 0;
}
三.总结
在double类型需要注意返回值,在结果体中需要注意需要⽐较的规则。总之,qsort()函数主要是关于参数中的最后⼀个⽐较函数的书写,只要注意到,基本上应该没有问题。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论