模仿qusort的形式实现一个冒泡排序

1.基本了qusort的形式

首先我们要了解qusort的基本形式,可以在cplusplus网站上进行查询。(以下为我的查询结果)

void qsort (void* base, size_t num, size_t size,int (*compar)(const void*,const void*));

注:1.base表示数组名(首元素地址),

2.num表示数组中待排序的元素个数,

3.size表示待排序数字的类型所占字节长度,

4.int(*compar)(const void*,const void*)则表示一个函数指针(指向一个返回类型为int,参数为(const void*,const void*的函数))

了解了该库函数的基本形式之后,我们就要对其形式进行一个深入理解,首先是base,这个很容易理解,毕竟是要对一个数组进行排序,不传入数组怎么能行呢。然后是num,这个也容易理解,就是待排序的数量嘛。那主要就是size和(*compar)这个两个参数不是很清楚了。既然是排序,那传入一个类型所占长度和一个函数指针这是要干什么呢。这就关乎qusort本身啦,首先qusort是要实现一个无类型排序及无论传入什么类型都可以排序,这也是base前置类型是void*的原因(因为如果定义成其他类型比如int*类型,char*就不好传入),既然不确定传入的类型又要实现一个交换的功能,那就可以传入类型所占长度,一个字节一个字节的进行交换。同样,因为类型的不确定,我们需要自己编写一个比较函数,然后将函数名进行传入。

2.模仿实现无类型的冒泡排序(以整形排序为例)

1.首先模仿编写函数名

如:

void bubble_sort(void* arr,int len,int sz,int (*cmp)(const void*,const void*))

2.编写函数体

主体是冒泡排序就不多过赘述了,直接上代码

int i, j;
    for (i = 0; i < len - 1; i++)
    {
        for (j = 0; j < len - 1 - i; j++)
        {
            if (cmp((char*)arr + j * sz, (char*)arr + (j + 1) * sz) > 0)
            {
                my_swap((char*)arr + j * sz, (char*)arr + (j + 1) * sz);
            }
        }
    }

这里需要注意的是因为我们传入的数组是无类型的,我们又要方便比较,所以进行一个(char*)的强转操作,这时传入的size可以用来完成跳过一个元素的操作。

3.编写交换函数

上面已经讲过,因为不知道传入类型,所以我们可以一个字节一个字节的进行交换,而又因为char类型是占一个类型的,所以我们这里可以适当的进行强转。

void my_swap(const void*p1,const void*p2)
{
    int num = (char*)p2 - (char*)p1;
    int i;
    for (i = 0; i < num; i++)
    {
        char temp = *((char*)p1 + i);
        *((char*)p1 + i) = *((char*)p2 + i);
        *((char*)p2 + i) = temp;
    }
}

到这里,无类型的冒泡排序基本上就实现了,在编写一个比较函数就可以用了。

这里附上我的代码:

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
/*qusort()   1.待排数组 2.数据长度 3.排序数目 4.排序函数 */
int cmp(const void* p1, const void* p2)
{
    return (*(int*)p1 - *(int*)p2);
}
void my_swap(const void*p1,const void*p2)
{
    int num = (char*)p2 - (char*)p1;
    int i;
    for (i = 0; i < num; i++)
    {
        char temp = *((char*)p1 + i);
        *((char*)p1 + i) = *((char*)p2 + i);
        *((char*)p2 + i) = temp;
    }
}
void bubble_sort(void* arr,int len,int sz,int (*cmp)(const void*,const void*))
{
    int i, j;
    for (i = 0; i < len - 1; i++)
    {
        for (j = 0; j < len - 1 - i; j++)
        {
            if (cmp((char*)arr + j * sz, (char*)arr + (j + 1) * sz) > 0)
            {
                my_swap((char*)arr + j * sz, (char*)arr + (j + 1) * sz);
            }
        }
    }
}
int main()
{
    int arr[10] = { 0 };
    for (int i = 0; i < 10; i++)
    {
        scanf("%d", &arr[i]);
    }
    bubble_sort(arr,sizeof(arr)/sizeof(arr[0]),sizeof(int),cmp);
    for (int i = 0; i < 10; i++)
    {
        printf("%d ", arr[i]);
    }
    return 0;
}