一、qsort函数:
在C语言中,`qsort` 函数是 C 标准库中的一个函数,用于对数组进行排序。
`qsort` 是 "quick sort" 的缩写,它实现了一个快速排序算法,但具体实现可能因编译器而异,不一定是传统意义上的快速排序算法。`qsort` 函数可以用来排序任意类型的数组,因为它允许用户指定比较函数。
__cdecl
__cdecl的全称是C Declaration,即C语言默认的函数调用方式。
函数参数的入栈顺序为从右到左入栈。函数返回时作用ret指令。由调用者手动清栈。被调用的函数支持可变参数。调用者根据调用时传入参数的个数,手动平衡堆栈。
`qsort` 函数的原型定义在 `<stdlib.h>` 头文件中,其原型如下:
参数说明:
- `void *base`:指向要排序的数组的第一个元素的指针。
- `size_t num`:数组中元素的数量。
- `size_t width`:数组中每个元素的大小(以字节为单位)。
- `int (*compar)(const void *, const void *)`:指向比较函数的指针,该函数用于确定排序顺序。比较函数应该返回负整数、零或正整数,以表示第一个参数应该排在第二个参数之前、两者相等还是之后。
qsort 函数 使用这个比较函数来决定数组中元素的相对顺序。比较函数的返回值应该如下:
使用 qsort 函数时,你需要根据待排序元素的具体类型来编写合适的比较函数。例如,如果你有一个整数数组,你可以编写一个比较函数来比较两个整数的大小。
如果你有一个结构体数组,你也可以编写一个比较函数来根据结构体中的某个字段来比较结构体的大小。在后面会发布文章;
二、用qsort函数实现冒泡排序
上一文章我们提到了冒泡排序的一般实现(可移步到):冒泡排序的实现-CSDN博客
这次我们使用qsort函数来实现冒泡排序:
#include<stdio.h>
#include<stdlib.h>//sqort函数头文件
int cmp(const void* e1, const void* e2)//自己定义,注意参数格式
{
return (*(int*)e1 - *(int*)e2);//如果需要实现降序排序,可以把e1和e2交换顺序
}
int main()
{
int arr[] = { 9,10,56,21,3,6,4,8,5 };//同样可以自己修改,添加scanf函数,实现输入并排序输出
int sz = sizeof(arr) / sizeof(arr[0]);
int i = 0;
qsort(arr, sz, sizeof(arr[0]), cmp);//重点!,注意四个参数的含义
for (i = 0; i < sz; i++)
{
printf("%d ", arr[i]);
}
return 0;
}
纯享版:
#include<stdio.h>
#include<stdlib.h>
int cmp(const void* e1, const void* e2)
{
return (*(int*)e1 - *(int*)e2);
}
int main()
{
int arr[] = { 9,10,56,21,3,6,4,8,5 };
int sz = sizeof(arr) / sizeof(arr[0]);
int i = 0;
qsort(arr, sz, sizeof(arr[0]), cmp);
for (i = 0; i < sz; i++)
{
printf("%d ", arr[i]);
}
return 0;
}
成功排序: