#include <stdio.h>
#include <stdlib.h>
// 比较函数,用于指定元素比较的规则
int compare(const void *a, const void *b) {
// 将void指针转换为int指针,并获取对应的值
int num1 = *((int*)a);
int num2 = *((int*)b);
// 如果num1 < num2,则返回一个负数
if (num1 < num2) {
return -1;
}
// 如果num1 > num2,则返回一个正数
else if (num1 > num2) {
return 1;
}
// 如果num1 == num2,则返回0
else {
return 0;
}
}
int main() {
int arr[] = {5, 2, 9, 1, 7};
int size = sizeof(arr) / sizeof(arr[0]);
// 使用qsort函数对数组进行排序
qsort(arr, size, sizeof(int), compare);
printf("排序结果:");
for (int i = 0; i < size; i++) {
printf("%d ", arr[i]);
}
return 0;
}
以上为一个简单的使用场景。
注意,compare函数后括号内必须是两个const void*类型
在上述代码中,定义了比较函数compare
,接受两个const void*
类型的参数,并将它们转换为int*
类型进行比较。
比较函数返回一个负数、零或正数,指示第一个元素小于、等于或大于第二个元素。
其中:
int size = sizeof(arr) / sizeof(arr[0]);
//是用来计算数组 arr 的元素个数的常见方式。)
//其中,sizeof(arr) 是用于获取整个数组 arr 的字节大小,sizeof(arr[0]) 是用于获取数组 arr 中每
//个元素的字节大小。通过将整个数组的字节大小除以每个元素的字节大小,得到的结果就是数组 arr 中元素的
//个数。
//将这个结果赋值给 int size 变量,就可以获得数组 arr 的元素个数。这样可以在不知道数组大小的情况下,
//动态地确定数组的元素个数。
//需要注意的是,这种计算方式只适用于静态数组,对于动态分配的数组或指向动态数组的指针,无法使
//用 sizeof 运算符来获取准确的数组大小。
以上为计算数组的大小。
然后,调用qsort
函数对数组进行排序
传入数组的首地址、
元素个数、
元素大小、
比较函数指针。
注意:
compare和qsort函数均在stdlib.h函数库中
还有一种更简洁的compare函数表达形式:
int compare(const void* a, const void* b)
{
return (*(int*)a - *(int*)b);
}
//升序排序
int compare (const void * a, const void * b)
{
return ( *(int*)a - *(int*)b );
}
//降序排列
int compare (const void * a, const void * b)
{
return ( *(int*)b - *(int*)a );
}