目录
qsort介绍与函数原型
qsort 函数是 C 语言标准库(stdlib.h)中提供的一个快速排序函数,用于对数组进行排序。这个函数非常灵活,因为它允许你指定数组中元素的数量、数组中元素的类型(通过指针的大小来隐含地表示),以及比较两个元素的函数。
qsort 函数的原型如下:
void qsort(void *base, size_t num, size_t size,
int (*compar)(const void *a, const void *b));
void *base
:指向要排序的数组的第一个元素的指针。size_t num
:数组中元素的数量。size_t size
:每个元素的大小,以字节为单位。int (*compar)(const void *a, const void *b)
:一个比较两个元素的函数指针。这个函数必须返回一个小于、等于或大于零的整数,分别表示第一个参数小于、等于或大于第二个参数。
其中对于排序规则函数,如果返回值小于0,表示不交换a和b,如果返回值大于0表示要交换a和b。
示例1:对整型数组排序
#include <stdio.h>
#include <stdlib.h>
// 比较函数
int compare(const void *a, const void *b) {
// 将 void 指针转换为 int 指针,然后解引用以获取实际的 int 值
int tempA = *(int*)a;
int tempB = *(int*)b;
return tempA - tempB; // 升序
}
int main() {
int arr[] = {64, 34, 25, 12, 22, 11, 90};
int n = sizeof(arr)/sizeof(arr[0]);
qsort(arr, n, sizeof(int), compare);
for(int i = 0; i < n; i++)
printf("%d ", arr[i]);
printf("\n");
// 11 12 22 25 34 64 90
return 0;
}
示例2:二维数组排序举例
按第一个元素升序,如果第一个元素相等,则第二个元素降序
#include <stdio.h>
#include <stdlib.h>
// 比较函数
int Compare(const void *a, const void *b)
{
// 将void指针转换为对应指针
int *tempA = (int *)a;
int *tempB = (int *)b;
// 首先按第一个元素升序排序
if (tempA[0] != tempB[0]) {
return tempA[0] - tempB[0];
}
// 如果第一个元素相同,则按第二个元素降序排序
return tempB[1] - tempA[1];
}
int main() {
// 二维数组
int arr[5][2] = {{3, 5}, {1, 2}, {3, 8}, {2, 4}, {2, 3}};
int n = sizeof(arr) / sizeof(arr[0]);
// 使用qsort进行排序
qsort(arr, n, sizeof(arr[0]), Compare);
// 打印排序后的数组
for (int i = 0; i < n; i++) {
printf("(%d, %d) ", arr[i][0], arr[i][1]);
}
printf("\n");
// (1, 2) (2, 4) (2, 3) (3, 8) (3, 5)
return 0;
}
示例3:对结构体数组排序(结构含有字符串成员)
结构体有三个成员,先按成员1排序,若成员1相等,则按成员2排序,若成员2相等,则按成员3排序。示例如下:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
// 定义结构体
typedef struct {
int first;
int second;
char str[50]; // 假设字符串最大长度为49
} MyStruct;
compare(const void *a, const void *b)
{
// 将void指针转换为MyStruct指针
MyStruct *structA = (MyStruct *)a;
MyStruct *structB = (MyStruct *)b;
// 首先按第一个整型成员升序排序
if (structA->first != structB->first) {
return structA->first - structB->first;
}
// 如果第一个整型成员相同,则按第二个整型成员降序排序
if (structA->second != structB->second) {
return structB->second - structA->second;
}
// 如果前两个成员都相同,则按字符串成员升序排序
return strcmp(structA->str, structB->str);
}
int main() {
// 初始化结构体数组
MyStruct arr[] = {
{3, 8, "apple"},
{1, 2, "banana"},
{3, 8, "cherry"},
{2, 4, "date"},
{2, 3, "elderberry"}
};
int n = sizeof(arr) / sizeof(arr[0]);
// 使用qsort进行排序
qsort(arr, n, sizeof(MyStruct), compare);
// 打印排序后的数组
for (int i = 0; i < n; i++) {
printf("(%d, %d, %s)\n", arr[i].first, arr[i].second, arr[i].str);
}
/*
排序结果
(1, 2, banana)
(2, 4, date)
(2, 3, elderberry)
(3, 8, apple)
(3, 8, cherry)
*/
return 0;
}
end