探索C语言标准库中的qsort函数
2023-12-25 19:38:42
引言
????????在C语言中,标准库提供了丰富的函数来支持各种操作,其中之一是qsort
函数。这个函数是用于排序数组的利器,能够轻松地对一维数组、二维数组和结构体数组等不同类型的数据进行排序。本文将深入探讨qsort
函数的使用,包括一维数组、二维数组和结构体数组的排序示例。
函数原型
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
,则返回零。 - 如果
a
小于b
,则返回负数。
- 如果
比较函数的编写
比较函数 compar
必须返回一个整数值,表示两个元素的大小关系。如果返回负数,表示第一个元素小于第二个;如果返回零,表示两个元素相等;如果返回正数,表示第一个元素大于第二个。
int compar(const void *p1, const void *p2)
{
// 根据需求编写比较逻辑
}
一个简单的示例,演示如何使用qsort
函数对整数数组进行排序:
#include <stdio.h>
#include <stdlib.h>
// 比较函数
int compare(const void *a, const void *b) {
return (*(int*)a - *(int*)b);
}
int main() {
int arr[] = {64, 34, 25, 12, 22, 11, 90};//初始化
int n = sizeof(arr) / sizeof(arr[0]);//计算长度
printf("原始数组:");
for (int i = 0; i < n; i++) {
printf("%d ", arr[i]);
}
// 使用qsort函数进行排序
qsort(arr, n, sizeof(int), compare);//sizeof(int) -- 计算元素长度
printf("\n排序后数组:");
for (int i = 0; i < n; i++) {
printf("%d ", arr[i]);
}
return 0;
}
- 声明了一个整数数组
arr
,包含了一些无序的整数。 - 打印原始数组。
- 调用
qsort
函数对数组进行排序。函数参数依次为数组首地址,数组元素个数,每个元素的大小(字节数),以及比较函数的地址。
结果打印:
原始数组:64 34 25 12 22 11 90
排序后数组:11 12 22 25 34 64 90
其他场景
当使用qsort
函数对一维数组、二维数组和结构体数组进行排序时,关键是提供适当的比较函数。以下是对这三种情况的例子:
1. 一维数组排序:
#include <stdio.h>
#include <stdlib.h>
int compareInt(const void *a, const void *b) {
return (*(int*)a - *(int*)b);
}
int main() {
int arr[] = {64, 34, 25, 12, 22, 11, 90};
int n = sizeof(arr) / sizeof(arr[0]);
printf("原始数组:");
for (int i = 0; i < n; i++) {
printf("%d ", arr[i]);
}
qsort(arr, n, sizeof(int), compareInt);
printf("\n排序后数组:");
for (int i = 0; i < n; i++) {
printf("%d ", arr[i]);
}
return 0;
}
2. 二维数组排序:
#include <stdio.h>
#include <stdlib.h>
// 比较函数
int compareRow(const void *a, const void *b) {
// 这里假设二维数组的每一行都有相同的列数
return (*(int*)a - *(int*)b);
}
int main() {
int arr[][3] = {{1, 3, 2}, {7, 5, 6}, {4, 8, 9}};
int rows = sizeof(arr) / sizeof(arr[0]);
int cols = sizeof(arr[0]) / sizeof(arr[0][0]);
printf("原始二维数组:\n");
for (int i = 0; i < rows; i++) {
for (int j = 0; j < cols; j++) {
printf("%d ", arr[i][j]);
}
printf("\n");
}
qsort(arr, rows, sizeof(arr[0]), compareRow);
printf("\n排序后二维数组:\n");
for (int i = 0; i < rows; i++) {
for (int j = 0; j < cols; j++) {
printf("%d ", arr[i][j]);
}
printf("\n");
}
return 0;
}
3. 结构体数组排序:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
// 定义结构体
struct Student {
char name[50];
int age;
};
// 比较函数
int compareStudent(const void *a, const void *b) {
return strcmp(((struct Student*)a)->name, ((struct Student*)b)->name);
}
int main() {
struct Student students[] = {{"Alice", 20}, {"Bob", 18}, {"Charlie", 22}};
int n = sizeof(students) / sizeof(students[0]);
printf("原始结构体数组:\n");
for (int i = 0; i < n; i++) {
printf("%s %d\n", students[i].name, students[i].age);
}
qsort(students, n, sizeof(struct Student), compareStudent);
printf("\n排序后结构体数组:\n");
for (int i = 0; i < n; i++) {
printf("%s %d\n", students[i].name, students[i].age);
}
return 0;
}
qsort
函数是C语言标准库中一个强大的排序工具,通过灵活的比较函数,我们可以对各种类型的数组进行排序,包括一维数组、二维数组和结构体数组。
文章来源:https://blog.csdn.net/2302_78381559/article/details/135206704
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!