一个泛型冒泡排序的实现

无聊中,于是写了一个冒泡排序的泛型算法。算法很简单,但是个人觉得从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;
}
 
时间: 2024-09-01 12:30:02

一个泛型冒泡排序的实现的相关文章

java中修饰方法的一个泛型指定为一个类问题

问题描述 java中修饰方法的一个泛型指定为一个类问题 java中修饰方法的一个泛型指定为一个类,那么这个方法的返回类型肯定就是这个类的对象,那返回的是这个类的子类的对象可以吗? 解决方案 可以的,但是在接收到参数进行处理的时候,是需要注意的.给你举个例子: public static void main(String[] args) { int int1 = (Integer) getInt();//正确 int int2 = (Integer) getInt2();//报错 java.lan

简单的一个php 冒泡排序算法

 代码如下 复制代码 <?php header('Content-Type: text/html; charset=utf-8'); //   简单冒泡算法      0 1 2 3 4 $a = array(5,4,3,2,1);  //5 echo  "比较54321   <br /><hr />"; function  mp($a){  //传值 要是数组         //i=1 i<5 i++         for($i=0;$i<

注解+反射+JDBC,实现一个简易的泛型DAO接口

一.实现思路        1.定义3个Annotation(注解):Entity.Id.Column,Entity作用于Type级别,用于标识JavaBean与数据库表名的映射关系.Id作用于Field级别,用于标识JavaBean中ID属性与表中ID字段的映射关系,Column作用于Field级别,用于标识JavaBean中除ID属性外的其它属性与表中字段的映射关系.      2.在Dao实现类中,通过反射API获得JavaBean中注解和属性的信息,如:表名.字段.JavaBean属性的

用PHP写的一个冒泡排序法的函数简单实例_php实例

前几天遇到的一道关于算法的考题,要求用PHP语言实现对一个数组进行排序,我写了一个采用冒泡排序法的函数,和大家分享一下. <? //冒泡排序法 function bubble_sort($array) { $count = count($array); if($count <= 0) { return false; } for($i=0; $i<$count; $i++) { for($k=$count-1; $k>$i; $k--) { if($array[$k] < $a

用PHP写的一个冒泡排序法的函数简单实例

前几天遇到的一道关于算法的考题,要求用PHP语言实现对一个数组进行排序,我写了一个采用冒泡排序法的函数,和大家分享一下. <? //冒泡排序法 function bubble_sort($array) { $count = count($array); if($count <= 0) { return false; } for($i=0; $i<$count; $i++) { for($k=$count-1; $k>$i; $k--) { if($array[$k] < $a

向Visual Basic程序员介绍泛型(二)

visual|程序|程序员 (接上篇) 正如你所见,泛型使用起来很简单.强类型化的代码可以避免运行时错误:智能感知会工作得更好.虽然使用泛型已经有非常充分的理由,不过使用泛型还有更多的优点:性能和代码重用. 将泛型技术引入.Net框架的一个主要原因是为了提高性能.比如集合类可以比以前工作得更快,因为编译器能够针对集合所储存的类型进行优化.下面的代码比较了数组.ArrayList以及泛型List的性能: txtOutput.Text = "Performance" & vbCrL

向Visual Basic程序员介绍泛型(一)

visual|程序|程序员 此文档是Sean Campbell, Scott Swigart, Kris Horrocks, Derek Hatchard, and Peter Bernhardt.等人创作的<向Microsoft Visual Basic程序员介绍Whidbey>一书中的样章,版权归原作者和出版社所有.转载请注明此声明. 本文用通俗的用语和大量的实例向Visual Basic程序员介绍了下一版Visual Basic.Net中将要增加的新功能--泛型.此文章可以帮助广大VB用

C# 2.0 Specification (泛型三)

接泛型二这篇文章是翻译的微软的技术文章.供学习c#的朋友参考,请勿用于商业目的.http://msdn.microsoft.com/vcsharp/team/language/default.aspx20.4 泛型委托声明委托声明可以包含类型参数. delegate-declaration: attributes opt delegate-modifiers op t delegate return-type identifier type-parameter-list opt (formal-

C#中的泛型 (From dotNet SDK 2.0 Beta1)

泛型(generic)是C#语言2.0和通用语言运行时(CLR)的一个新特性.泛型为.NET框架引入了类型参数(type parameters)的概念.类型参数使得设计类和方法时,不必确定一个或多个具体参数,其的具体参数可延迟到客户代码中声明.实现.这意味着使用泛型的类型参数T,写一个类MyList<T>,客户代码可以这样调用:MyList<int>, MyList<string>或 MyList<MyClass>.这避免了运行时类型转换或装箱操作的代价和风