【C语言】qsort使用

这篇博客详细介绍了C语言标准库中的快速排序函数`qsort`,包括其函数原型、参数解释和使用示例。通过示例展示了如何对整数数组、字符数组、字符串数组以及结构体数组进行排序。此外,还提供了结构体排序的示例,按成绩排序学生信息。

使用时需要先引用stdlib.h这个头文件

#include<stdlib.h>

函数声明

  int qsort(void*  base,size_t  num,size_t  width,int(*compare)(const *void e1)(const *void e2))

其中compare为排序函数

int compare(const void* e1, const void* e)

首先看排序函数的参数 排序函数的参数类型 一定是const void*
const—可以使在函数运行的过程中 原数组的值不被改变
void—是为了提升函数普适性,强制规定函数参数为void*
因为一会要返回参数 所以函数返回类型规定int

使用示例

1、数组排序

#include<stdio.h>
#include<stdlib.h>
int compare(const void* e1, const void* e2)
{
	int* p1 = e1;
	int* p2 = e2;
	if (*p1 > *p2)
	{
		return 1;
	}
	else if (*p1 == *p2)
	{
		return 0;
	}
	else if (*p1 < *p2)
	{
		return -1;
	}
}
int main()
{
	int arr[10] = { 1,3,5,7,9,2,4,6,8,10 };
	qsort(arr, 10, 4, compare);
	for (int i = 0; i <= 9; i++)
	{
		printf("%d ", arr[i]);
	}
}

2、字符数组排序

#include<stdio.h>
#include<stdlib.h>
int compare(const void* e1, const void* e2)
{
	char* p1 = e1;
	char* p2 = e2;
	if (*p1 > *p2)
	{
		return 1;
	}
	else if (*p1 == *p2)
	{
		return 0;
	}
	else if (*p1 < *p2)
	{
		return -1;
	}
}
int main()
{
	char arr[10] = { 'a','c','b','d','h','g','t','n' ,'w'};
	qsort(arr, 9, 1, compare);
	printf("%s", arr);
}

3、字符串排序

#include<stdio.h>
#include<stdlib.h>
int compare(const void* e1, const void* e2)//规定按首字母顺序排序
{
	char* p1 = e1;
	char* p2 = e2;
	if (*p1 > *p2)
	{
		return 1;
	}
	else if (*p1 == *p2)
	{
		return 0;
	}
	else if (*p1 < *p2)
	{
		return -1;
	}
}
int main()
{
	char arr1[5] = "abc";
	char arr2[5] = "bcd";
	char arr3[5] = "cdf";
	char arr4[5] = "gnm";
	char* arr[4] = { arr1,arr2,arr3,arr4 };//定义了一个指针数组来存放四个字符串数组的指针(数组名为数组第一个元素地址)
	qsort(arr, 4, 4, compare);//每个元素均为指针,指针大小为4字节
	printf("%s %s %s %s", arr1,arr2,arr3,arr4);
}

4、结构体排序

#include<stdio.h>
#include<stdlib.h>
struct stu
{
	int grade;
	char name[20];
	char sex[10];
};
int compare(const void* e1, const void* e2)//规定按成绩排序
{
	struct stu* p1 = e1;
	struct stu* p2 = e2;
	if (p1->grade > p2->grade)
	{
		return 1;
	}
	else if (p1->grade==p2->grade)
	{
		return 0;
	}
	else if (p1->grade < p2->grade)
	{
		return -1;
	}
}
 
int main()
{
	struct stu a = { 90,"zhangsan","man" };
	struct stu b = { 80,"lisi","man" };
	struct stu c = { 70,"wangwu","man" };
	struct stu arr[3] = { a,b,c };
	qsort(arr, 3, sizeof(a), compare);
	for (int i = 0; i <= 2; i++)
		printf("%d %s %s\n", arr[i].grade, arr[i].name, arr[i].sex);
}
<think>嗯,用户想了解C语言qsort函数的用法,特别是使用方法的示例。首先,我需要回忆一下qsort的基本知识。qsort是C标准库中的一个函数,用于对数组进行快速排序。它的头文件是<stdlib.h>,这点很重要,用户在使用前必须包含这个头文件。 接下来,qsort的参数有四个:数组首元素地址、元素个数、每个元素的大小,以及比较函数。比较函数是关键,它决定了排序的顺序。比较函数需要接收两个const void*类型的参数,并返回一个整数。如果返回负数,表示第一个参数应该排在前面;正数则相反;零表示相等。 用户可能需要具体的示例来理解如何使用。比如,对整数数组排序,或者对结构体排序。我应该举两个例子,一个是简单的int数组,另一个是结构体,比如学生信息,按分数排序。这样用户可以看到不同数据类型的处理方式。 还要注意比较函数的实现。对于int类型,需要将void指针转换为int指针,再解引用比较值。结构体的比较则要提取结构体成员,比如分数,并进行比较。 用户可能遇到的问题包括忘记包含头文件、比较函数返回值错误、或者元素大小计算错误。在示例中要确保这些细节正确,比如使用sizeof(arr[0])来获取元素大小,避免硬编码。 另外,需要提醒用户,qsort是不稳定排序,但快速排序通常效率较高。可能还需要提到比较函数编写时的注意事项,比如处理溢出问题,或者在比较字符串时使用strcmp等。 最后,根据用户提供的引用资料,引用[1]、[2]、[3]都涉及qsort的基本使用,参数说明和头文件包含。在回答中要正确引用这些内容,确保信息准确。</think>### C语言qsort函数使用方法详解 qsort函数是C标准库中提供的通用排序函数,采用快速排序算法实现。以下是具体使用步骤: 1. **包含头文件** ```c #include <stdlib.h> // 必须包含该头文件[^2] ``` 2. **函数原型** ```c void qsort(void *base, size_t nmemb, size_t size, int (*compar)(const void *, const void *)); ``` 参数说明: - `base`:待排序数组首元素地址 - `nmemb`:数组元素个数 - `size`:单个元素大小(字节) - `compar`:比较函数指针[^3] 3. **比较函数编写示例** ```c // 整型比较函数(升序) int compare_int(const void* a, const void* b) { return (*(int*)a - *(int*)b); // 升序规则 } // 字符串比较函数 int compare_str(const void* a, const void* b) { return strcmp(*(const char**)a, *(const char**)b); } ``` 4. **完整使用示例** ```c #include <stdio.h> #include <stdlib.h> // 结构体示例 typedef struct { char name[20]; int score; } Student; int compare_student(const void* a, const void* b) { return ((Student*)a)->score - ((Student*)b)->score; } int main() { // 示例1:整型数组排序 int arr[] = {5, 2, 8, 1, 9}; int n = sizeof(arr)/sizeof(arr[0]); qsort(arr, n, sizeof(int), compare_int); // 示例2:结构体数组排序 Student students[] = {{"Alice", 85}, {"Bob", 72}, {"Charlie", 90}}; int m = sizeof(students)/sizeof(students[0]); qsort(students, m, sizeof(Student), compare_student); return 0; } ``` **注意事项**: 1. 比较函数必须严格返回-1/0/1三种状态 2. 对浮点数比较时应避免直接相减(可能溢出) 3. 排序字符串数组时需使用二级指针 4. 结构体排序需明确比较字段 **性能特点**: - 时间复杂度:平均$O(n \log n)$,最坏$O(n^2)$ - 空间复杂度:$O(\log n)$ - 属于不稳定排序(相同元素可能改变顺序)[^1]
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值