一个泛型冒泡排序的实现

简介:

无聊中,于是写了一个冒泡排序的泛型算法。算法很简单,但是个人觉得从C标准库中学到的这种泛型的思想很有益处。


/*
* 冒泡排序的泛型实现
*/

#include <stdio.h>
#include <string.h>

static void Swap(char *vp1, char *vp2, int width)
{
    char tmp;

    if ( vp1 != vp2 ) {
        while ( width-- ) {
            tmp = *vp1;
            *vp1++ = *vp2;
            *vp2++ = tmp;
        }
    }
}

void BubbleSort(void *base, int n, int elem_size,
                    int (*compare)( void *, void * ))
{
    int  i, last, end = n - 1;
    char *elem_addr1, *elem_addr2;

    while (end > 0) {
        last = 0;
        for (i = 0; i < end; i++) {
            elem_addr1 = (char *)base + i * elem_size;
            elem_addr2 = (char *)base + (i + 1) * elem_size;
            if (compare( elem_addr1, elem_addr2 ) > 0) {
                Swap(elem_addr1, elem_addr2, elem_size);
                last = i;
            }
        }
        end = last;
    }
}

int compare_int(void *elem1, void *elem2)
{
    return (*(int *)elem1 - *(int *)elem2);
}

int compare_double(void *elem1, void *elem2)
{
    return (*(double *)elem1 > *(double *)elem2) ? 1 : 0;
}

int main(int argc, char *argv[])
{
    int num_int[8] = {8,7,6,5,4,3,2,1};
    double num_double[8] = {8.8,7.7,6.6,5.5,4.4,3.3,2.2,1.1};
    int i;

    BubbleSort(num_int, 8, sizeof(int), compare_int);

    for (i = 0; i < 8; i++) {
        printf("%d ", num_int[i]);
    }

    printf("\n");

    BubbleSort(num_double, 8, sizeof(double), compare_double);

    for (i = 0; i < 8; i++) {
        printf("%.1f ", num_double[i]);
    }

    return 0;
}
 


目录
相关文章
|
2月前
|
C语言
【c语言】qsort函数及泛型冒泡排序的模拟实现
本文介绍了C语言中的`qsort`函数及其背后的回调函数概念。`qsort`函数用于对任意类型的数据进行排序,其核心在于通过函数指针调用用户自定义的比较函数。文章还详细讲解了如何实现一个泛型冒泡排序,包括比较函数、交换函数和排序函数的编写,并展示了完整的代码示例。最后,通过实际运行验证了排序的正确性,展示了泛型编程的优势。
37 0
|
7月前
|
搜索推荐 算法 C语言
【排序算法】C语言实现选择排序与冒泡排序
【排序算法】C语言实现选择排序与冒泡排序
101 0
|
7月前
|
搜索推荐 C语言
C语言排序算法之冒泡排序
C语言排序算法之冒泡排序
|
搜索推荐 C语言
冒泡排序与qsort函数详解
提及到排序,冒泡排序算是一个很基础的排序了。那么冒泡排序到底是什么呢?冒泡排序在什么情况下使用呢?qsort函数又是什么呢?接下来我给大家通过举例来详细解释一下。
64 0
|
C语言
C语言实现数组的排序——冒泡排序
C语言实现数组的排序——冒泡排序
138 0
|
存储 编译器 C语言
【C】数组+冒泡排序
【C】数组+冒泡排序
139 0
【C】数组+冒泡排序
泛型栈和队列
泛型栈和队列
131 0
冒泡排序函数题
 用C实现以下功能:①从键盘上读入一组整数(可正可负,最多10000个),数与数之间只使用空格或回车作分隔。但若读入的数为-999时,则表示输入结束且-999不算在该组数内;②对这一组数按从小到大的顺序进行排序;③将排序后的这一组数输出到屏幕上,输出格式为每行6个数,每个数按宽度为6个字符宽度。
|
C语言
C语言数组+冒泡排序
C语言数组+冒泡排序
132 0
C语言数组+冒泡排序
冒泡排序完整代码讲解
冒泡排序完整代码讲解
261 0