qsort函数C语言编译器函数库自带的一个接口,作用是用快速排序的方式进行排序
qsort 的函数原型是:
void qsort (void* base, size_t num, size_t size, int ( *compar)(const void*, const void* ) );
参数解释:
base ---- 指向要排序的数组的第一个元素的指针, 并转换为void* 类型
num ---- 由base所指向的数组的元素的个数,size_t 是无符号整数类型
size ---- 数组中每个元素的大小,以字节为单位
compar ---- 用来比较两个元素的函数,即函数指针(回调函数)
compar参数
compar参数指向一个比较两个元素的函数。比较函数的原型应该像下面这样。
注意两个形参必须是const void *型,同时在调用compar 函数(compar实质为函数指针,这里称它所指向的函数也为compar)时,传入的实参也必须转换成const void *型。在compar函数内部会将const void *型转换成实际类型。
int compar(const void *p1, const void *p2);
–1--> 如果compar返回值小于0(< 0),那么p1所指向元素会被排在p2所指向元素的前面;
–2--> 如果compar返回值等于0(= 0),那么p1所指向元素与p2所指向元素的顺序不确定;
–3--> 如果compar返回值大于0(> 0),那么p1所指向元素会被排在p2所指向元素的后面。
模拟实现的代码如下:(冒泡法)
#include<stdio.h>
#include<windows.h>
int int_cmp(const void *p1, const void *p2) //比较p1和p2的指向的大小
{
return (*(int *)p1 > *(int *)p2);
}
void _swap(void *p1, void *p2, int size) //交换
{
int i = 0;
for (i = 0; i < size; i++){
char tmp = *((char *)p1 + i);
*((char *)p1 + i) = *((char *)p2 + i);
*((char *)p2 + i) = tmp;
}
}
void bubble(void *base, int count, int size, int(*cmp)(void *, void *)) //冒泡法实现数组的排序
{
int i = 0;
int j = 0;
for (i = 0; i < count - 1; i++){
for (j = 0; j < count - i - 1; j++){
if (cmp((char *)base + j * size, (char *)base + (j + 1) * size) > 0){
_swap((char *)base + j * size, (char *)base + (j + 1) * size, size); //逐地址推进
}
}
}
}
int main()
{
int arr[] = { 1, 3, 5, 7, 9, 2, 4, 6, 8, 0 };
int i = 0;
bubble(arr, sizeof(arr) / sizeof(arr[0]), sizeof(int), int_cmp);
for (i = 0; i < sizeof(arr) / sizeof(arr[0]); i++){
printf("%d ", arr[i]);
}
printf("\n");
system("pause");
return 0;
}