C语言的排序函数qsort()详解

2023-11-06

一.qsort()函数的用法及使用说明:

目录

一.qsort()函数的用法及使用说明:

二.使用qsort()函数来求关于各种类型的(降序)排序

1.int类型的数组进行排序

2.char类型的数组进行排序

3.double类型的数组排序(与前两个有区别)

4.结构体进行排序(按照需要用什么进行排序,具体情况具体分析)

三.总结


 

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()函数主要是关于参数中的最后一个比较函数的书写,只要注意到,基本上应该没有问题。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C语言的排序函数qsort()详解 的相关文章

  • 提升职场价值,把握成长方向

    来自 IT人的职场进阶 同样的职场起点 为什么几年后大家差距很大 如果想快速升职加薪 有什么好方法吗 如何才能做到持续且快速的成长 这些疑惑都离不开一个本质问题 职场价值 因为企业用人的核心出发点是 你能否为企业创造价值 你的价值和薪酬职级
  • MSP430 EEPROM-24C512使用总结及代码说明

    MSP430 EEPROM 24C512使用总结及代码说明 https wenku baidu com view 61f407d6f705cc175527094b html
  • hooks中useMemo和useCallback详解

    要想学习useMemo必须要先知道React memo 这两者都有一定的优化作用 memo的作用 当数据变化时 代码会重新执行一遍 但是子组件数据没有变化也会执行 这个时候可以使用memo将子组件封装起来 让子组件的数据只在发生改变时才会执

随机推荐