qsort
函数是C语言标准库中提供的一个快速排序函数,定义在stdlib.h
头文件中。它可以对数组进行排序,用户可以定义排序的规则。qsort
函数的使用灵活性高,不仅可以用于基本数据类型的排序,还可以用于结构体或其他自定义类型的排序。
函数原型
void qsort(void *base, size_t nmemb, size_t size, int (*compar)(const void *, const void *));
base
:指向要排序的数组的第一个元素的指针。nmemb
:数组中的元素数量。size
:数组中每个元素的大小,通常使用sizeof
运算符得到。compar
:比较两个元素的函数,该函数需要用户自定义,函数返回值小于、等于或大于0分别表示第一个参数小于、等于或大于第二个参数。
比较函数的原型
int compar(const void *a, const void *b);
a
和b
:指向需要比较的两个元素的指针。
知道了基本原理,现在我们需要模仿qsort的功能实现一个通用的冒泡排序;
废话不说先上完整代码,接着是解析;
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
//模仿qsort函数,用冒泡函数排序任意数据
int int_cmp(const void* p1, const void* p2)
{
return *(int*)p1 - *(int*)p2;
}
void _swap(char* buf1, char* buf2, size_t width)
{
int i = 0;
for (i = 0; i < width; i++)
{
char tmp = *buf1;
*buf1 = *buf2;
*buf2 = tmp;
buf1++;
buf2++;
}
}
void bubble(void* base, size_t sz, size_t width, int (*cmp)(const void* p1, const void* p2))
{
int i = 0;
for (i = 0; i < sz - 1; i++)
{
int j = 0;
for (j = 0; j < sz - 1 - i; j++)
{
if (cmp((char*)base + j * width, (char*)base + (j + 1) * width) > 0)
{
_swap((char*)base + j * width, (char*)base + (j + 1) * width, width);
}
}
}
}
void print_arr(int arr[], int sz)
{
int i = 0;
for (i = 0; i < sz; i++)
{
printf("%d ", arr[i]);
}
}
int main()
{
int arr[] = { 2,9,4,1,6,3,5,7,8,0 };
int sz = sizeof(arr) / sizeof(arr[0]);
bubble(arr, sz, sizeof(arr[0]), int_cmp);
print_arr(arr, sz);
}
开始分析:
定义比较函数 int_cmp
int int_cmp(const void* p1, const void* p2)
{
return *(int*)p1 - *(int*)p2;
}
这个函数比较两个整数的大小,并返回比较结果。如果第一个整数小于第二个,返回负值;如果相等,返回0;如果第一个大于第二个,返回正值。这是排序算法决定元素顺序的关键。
定义交换函数 _swap
void _swap(char* buf1, char* buf2, size_t width)
{
int i = 0;
for (i = 0; i < width; i++)
{
char tmp = *buf1;
*buf1 = *buf2;
*buf2 = tmp;
buf1++;
buf2++;
}
}
这个函数用于交换两个元素的内容。由于函数操作的是字节级别的数据,所以使用char*
来遍历元素的每个字节,并进行交换。这样可以保证函数对任意类型的数据都能正确工作。
实现冒泡排序的 bubble
函数
void bubble(void* base, size_t sz, size_t width, int (*cmp)(const void* p1, const void* p2))
{
int i = 0;
for (i = 0; i < sz - 1; i++)
{
int j = 0;
for (j = 0; j < sz - 1 - i; j++)
{
if (cmp((char*)base + j * width, (char*)base + (j + 1) * width) > 0)
{
_swap((char*)base + j * width, (char*)base + (j + 1) * width, width);
}
}
}
}
这个函数实现了冒泡排序算法。它通过不断比较和交换相邻元素来排序整个数组。cmp
函数用于比较两个元素,而_swap
函数用于交换元素位置。通过泛型指针和元素大小参数,这个函数可以应用于不同类型和大小的数据。
主函数 main
int main()
{
int arr[] = { 2,9,4,1,6,3,5,7,8,0 };
int sz = sizeof(arr) / sizeof(arr[0]);
bubble(arr, sz, sizeof(arr[0]), int_cmp);
print_arr(arr, sz);
}
在主函数中,定义了一个整数数组并计算了它的大小。然后调用bubble
函数对其进行排序,并通过print_arr
函数打印排序后的数组。
总体来说,这个示例很好地说明了如何通过冒泡排序和泛型编程技术来模仿qsort
函数的功能,实现对任意类型数据的排序。
以上就是所有内容了;
如有不足之处希望大家可以指出;
我是高耳机。