qsort函数的详细说明及举例运用

qsort函数详解

`功能:Q排序,对一组字符串(其中既有数字又有字母,将其ASCII码值进行比较,并排序,以字符输出)


文章目录

  • qsort函数详解
  • 1.qsort函数的格式及各参数意义
  • 2.compare具体是什么?
  • 3.使用步骤
    • 代码举例1
    • 代码举例2
    • 代码举例3
    • 代码举例4
  • 4.总结


1.qsort函数的格式及各参数意义

qsort(arr, sz, sizeof(char), compare)

void qsort(void* base, //待排序数组的第一个元素的地址
	       size_t num, //待排序数组的元素个数
	       size_t size,//待排序数组中一个元素的大小
	       int (* cmp)(const void* e1, const void* e2)//函数指针-cmp指向了一个函数,这个函数是用来比较两个元素的
           //e1和e2中存放的是需要比较的两个元素的地址
          );

2.compare具体是什么?

int compare(const void* a, const void* b)
{
return ((char)a) - ((char)b);
}

该函数的参数类型使用了const void ,这是一种通用的指针类型,可以指向任何类型的数据。
先将a和b强制转换成char类型的指针,然后通过外面的
获取指针指向的值,然后比较

3.使用步骤

代码举例1

第一类,排序整数

//第一类,排序整数
#define _CRT_SECURE_NO_WARNINGS 1
#include 
#include 


int cmp_int(const void* e1, const void* e2)
{
	return *(int*)e1 - *(int*)e2;
}


void print_arr(int arr[], int sz)
{
	int i = 0;
	for (i = 0; i < sz; i++)
	{
		printf("%d ", arr[i]);
	}
	printf("\n");
}


//测试qsort排序整型数据
void test1()
{
	int arr[] = { 9,8,7,6,5,4,3,2,1,0 };
	int sz = sizeof(arr) / sizeof(arr[0]);
	print_arr(arr, sz);
	qsort(arr, sz, sizeof(arr[0]), cmp_int);
	print_arr(arr, sz);
}


int main()
{
	//数据
	test1();
	return 0;
}

qsort函数的详细说明及举例运用_第1张图片

代码举例2

第二类,排序结构体中的数字大小

//第二类,排序结构体中的数字大小
#define _CRT_SECURE_NO_WARNINGS 1
#include 
#include 


struct Stu
{
	char name[20];
	int age;
};


int compar_age(const void* e1, const void* e2)
{
	return ((struct Stu*)e1)->age - ((struct Stu*)e2)->age;
}




void test2()
{
	struct Stu arr[] = { {"pig",999},{"chicken",10},{"tiger",55}};
	int sz = sizeof(arr) / sizeof(arr[0]);
	for (int i = 0; i < sz; i++)
	{
		printf("姓名: %s,年龄 : %d\n", arr[i].name, arr[i].age);
	}
	printf("\n");
	qsort(arr, sz, sizeof(arr[0]), compar_age);
	for (int i = 0; i < sz; i++)
	{
		printf("姓名: %s,年龄 : %d\n", arr[i].name, arr[i].age);
	}
}


int main()
{
	test2();
	return 0;
}

qsort函数的详细说明及举例运用_第2张图片

代码举例3

第三类,排序结构体中的字符串大小

//第三类,排序结构体中的字符串大小
#define _CRT_SECURE_NO_WARNINGS 1
#include 
#include 


struct Stu
{
	char name[20];
	int age;
};


int compar_age(const void* e1, const void* e2)
{
	return  strcmp(((struct Stu*)e1)->name , ((struct Stu*)e2)->name);
}




void test2()
{
	struct Stu arr[] = { {"pig",999},{"chicken",10},{"tiger",55} };
	int sz = sizeof(arr) / sizeof(arr[0]);
	for (int i = 0; i < sz; i++)
	{
		printf("姓名: %s,年龄 : %d\n", arr[i].name, arr[i].age);
	}
	printf("\n");
	qsort(arr, sz, sizeof(arr[0]), compar_age);
	for (int i = 0; i < sz; i++)
	{
		printf("姓名: %s,年龄 : %d\n", arr[i].name, arr[i].age);
	}
}


int main()
{
	test2();
	return 0;
}

qsort函数的详细说明及举例运用_第3张图片

代码举例4

代码如下(示例):

#define _CRT_SECURE_NO_WARNINGS 1//此代码在VS2019使用,此代码可以消除scanf的警告。
#include 
#include 
#include 
//该函数的参数类型使用了const void *,这是一种通用的指针类型,可以指向任何类型的数据。
int compare(const void* a, const void* b)
{
    return (*(char*)a) - (*(char*)b);
}
//先将a和b强制转换成char类型的指针,然后通过外面的*获取指针指向的值,然后比较

int main()
{
    char arr[1000];//输入的字符
    int i = 0;
    scanf("%[^\n]", &arr);//此代码加入[^\n]后可以输入空格
    int sz = strlen(arr);

    qsort(arr, sz, sizeof(char), compare);//qsort用法其中arr表示排序数组,sz表示数组的长度,sizeof(char)表示数据类型,compare表示比较函数。
    //通常使用qsort函数时,后面的compare写法是固定的,恒为上面的写法
    for (i = 0; i < sz; i++)
    {
        printf("%c", arr[i]);
    }

    return 0;
}

输入:Ihave1nose2hands10fingers
输出:0112Iaadeeefghhinnnorsssv

这段代码的功能是将输入的字符串按照字符的字典序进行排序,并输出排序后的字符串。

①首先,在main函数中,定义了一个char类型的数组arr用于存储输入的字符串,然后使用scanf函数读取输入的字符串,并将其存储在数组arr中。接着,使用strlen函数获取数组arr中字符串的长度,并将结果保存在变量sz中。

②然后,调用了qsort函数对数组arr进行排序。qsort函数的使用需要传入以下参数:

arr:表示待排序的数组。 sz:表示数组的长度。 sizeof(char):表示数据类型的大小,这里是表示char类型的大小。
compare:表示比较函数,这里调用了自定义的compare函数。 在compare函数中,使用了const
void类型的参数a和b,它们是通用的指针类型,可以指向任何类型的数据。在函数内部,通过强制转换将a和b转换为char类型的指针,然后通过外层的*获取指针指向的值,即字符的ASCII码。最后,将这两个ASCII码相减的结果作为比较的依据,如果结果小于0,则表示a应排在b之前;如果结果大于0,则表示a应排在b之后;如果结果等于0,则表示a和b相等。

③最后,在一个循环中,按顺序输出排序后的字符。

需要注意的是,在代码开头添加了#define_CRT_SECURE_NO_WARNINGS 1这行代码,是为了解决使用scanf函数时的编译器警告。

4.总结

以上就是今天对于qsort函数的全部说明了,差点忘了这个函数的头文件是#include
qsort函数是C语言标准库中提供的一个快速排序算法的实现。它可以用于对任意类型的数组进行排序。

函数原型为:

void qsort(void *base, size_t nmemb, size_t size, int (*compar)(const void *, const void *));

参数说明:

base:指向待排序的数组的起始地址。
nmemb:数组中元素的个数。
size:每个元素的大小(字节数)。
compar:用于比较两个元素的函数指针。

比较函数的原型为:

int compar(const void *a, const void *b);

参数说明:

a, b:指向待比较的两个元素的指针。 比较函数需要返回一个整数值,表示a和b的大小关系:

若返回值小于0,表示a小于b。 若返回值等于0,表示a等于b。 若返回值大于0,表示a大于b。

使用qsort函数进行排序时,需要根据待排序数组的元素类型自己编写比较函数。比较函数根据需要可以是升序、降序或其他特定的排序顺序。大家好好结合上面的例子进行学习哦!

你可能感兴趣的:(c语言)