C 语言泛型编程--quickSort实现

1 #ifndef _GENERICQUICKSORT_H_
2 #define _GENERICQUICKSORT_H_
3 void generic_swap(void * pa, void * pb, int typeSize);
4 void generic_qsort(void * pa, int elemSize, int typeSize,
5                             int (*cmp)(void *,void *));
6 #endif

generic_quick_sort.h

 1 #include <stdlib.h>
 2 #include <string.h>
 3 #include <stdio.h>
 4 #include "generic_quick_sort.h"
 5
 6 static void quick_sort();
 7 void generic_swap(void * pa, void * pb, int typeSize)
 8 {
 9     void * ptmp = malloc(typeSize);
10     memcpy(ptmp,pa,typeSize);
11     memcpy(pa,pb,typeSize);
12     memcpy(pb,ptmp,typeSize);
13     free(ptmp);
14 }
15
16 void generic_qsort(void *pa, int elemSize, int typeSize,
17                             int (*cmp)(void *, void *))
18 {
19     char *paa = (char*)pa;
20     quick_sort(paa,0,elemSize-1,typeSize,cmp);
21 }
22
23 static void quick_sort(char *paa, int beg, int end, int typeSize,
24                             int (*cmp)(void *, void *))
25 {
26     if(beg >= end)
27         return;
28     int mid = (beg+end)/2;
29     g_swap(paa + end * typeSize, paa + mid * typeSize, typeSize);
30     char *border = paa + end * typeSize;
31     int i = beg;
32     int j = beg;
33     for(; j < end; j++)
34     {
35         if(cmp(paa+j*typeSize, border) < 0){
36             g_swap(paa+j*typeSize, paa+i*typeSize,typeSize);
37             i++;
38         }
39     }
40     g_swap(paa+j*typeSize, paa+i*typeSize,typeSize);
41     quick_sort(paa,beg,i-1,typeSize,cmp);
42     quick_sort(paa,i+1,end,typeSize,cmp);
43 }

generic_quick_sort.c

 1 #include <stdlib.h>
 2 #include <stdio.h>
 3 #include <string.h>
 4 #include "generic_quick_sort.h"
 5 #define PRINT_STUDENT(stu)     6     printf("name = %-10s, score = %-.2f\n",stu.name, stu.score)
 7
 8 enum {LEN=10};
 9 typedef struct student{
10     char name[LEN];
11     double score;
12 }student;
13
14 int cmp_stu(void *a, void *b);
15
16 int main()
17 {
18     student stu[5] = {
19         {"Linda", 76.14},
20         {"Angel",84.41},
21         {"Jim", 98.25},
22         {"Trump", 34.98},
23         {"Walle", 100}
24     };
25     generic_qsort(&stu,5,sizeof(student),cmp_stu);
26     for(int i = 0; i < 5; i++){
27         PRINT_STUDENT(stu[i]);
28     }
29     return 0;
30 }
31
32 int cmp_stu(void *a, void *b)
33 {
34     student * pa = (student *)a;
35     student * pb = (student *)b;
36     if(pa->score < pb->score)
37         return -1;
38     else if(pa->score > pb->score)
39         return 1;
40     else return 0;
41 }

main

时间: 2024-11-06 11:31:59

C 语言泛型编程--quickSort实现的相关文章

JAVA语言泛型编程实现单例模式

今天去面试,面试官问了一个设计模式---单例模式,这也是我们最常用的设计模式,由于面试时间有限,我只是把如何使用泛型编程实现单例模式大致意思说了一下.现在主要说一下如何用泛型编程实现单例模式,使用少量代码,实现一劳永逸的方法. 先来看一下我们简单的object: package singleton; /***  *   * @author Linux一叶  * 只是为了测试时使用  *  */ public class People { /***  * 属性变量  * age 年龄  * nam

十大排序算法--多图预警

十大排序算法 十大排序算法 简单的排序算法 插入排序 冒泡排序 选择排序 高效的比较排序算法 希尔排序 快速排序 归并排序 堆排序 牺牲空间的线性排序算法 计数排序 桶排序 基数排序 综合分析 简单的排序算法 Θ(n^2) 插入排序 动画演示 enter description here 原理 将数组看成两部分,一部分为已排序好的数组,后面的部分为未排序数组,每次从后面的数组中取出元素与前面的有序元素一一比较,若小于则向前移动,直到找到正确的位置插入.遍历后面的数组直到整个数组排序完成. 代码

Swift语言中的泛型编程 【Generic】【Part 1】

泛型  泛型编程让你可以编写更具扩展性.易重用的功能,代码使用时的类型取决于你所定义的业务需求.你可以编写避免重复的代码,目标更加清晰明确,风格抽象. 泛型是Swift语言的一项强大的特性,基本上所有的swift标准库都建立在泛型代码上.实际上,你在这本书的时候不知不觉地接触到泛型,它贯穿始终.例如Swift的数组和字典类型都是泛型集合.你可以创建用于存放整数值的数组,也创建数组存储字符串,其他所有能在Swift中创建的类型都可以创建到数组中.类似的,你可以创建字典来存储数值或其他指定的类型,毫

C语言的泛型编程

1 问题引入 首先引入一个问题,实现一个泛型的swap函数,分别使用C++和C实现. 2 C++的泛型 C++有良好的泛型编程机制,所以我很快就写出了C++版的泛型swap函数. template<typename T> void MySwap(T &a, T &b) { T c = a; a = b; b = c; } 3 C语言的泛型 我的第一想法是既然不能直接交换变量(类型不知道),那就交换指针呀.下一瞬间,我就很想给自己一巴掌!是左值吗你就交换指针?Stupid! 那就

快排 快速排序 qsort quicksort C语言

现在网上搜到的快排和我以前打的不太一样,感觉有点复杂,我用的快排是FreePascal里/demo/text/qsort.pp的风格,感觉特别简洁. 1 #include<stdio.h> 2 #define MAXN 10000 3 int a[MAXN]; 4 int n; 5 void Mysort(int l, int r) { 6 int x,y,mid,t; 7 mid = a[(l+r)/2]; 8 x=l; 9 y=r; 10 do { 11 while(a[x]<mid

《泛型编程与stl》笔记

以下是STL六大组件(componments): adapters  配接器 用来修饰其他组件.包括iterator adapters.function adapters.container adapters三大类. allocators 配置器 用来分配空间.空间可来自于内存或磁盘--取决于配置器如何 实现.主要用来服务容器. algorithms 算法 如sort,bineary search,permutation.... containers 容器 就是数据结构,用来存放元素.如vect

C++泛型编程之函数模板

泛型语义 泛型(Generic Programming),即是指具有在多种数据类型上皆可操作的含意.泛型编程的代表作品 STL 是一种高效.泛型.可交互操作的软件组件. 泛型编程最初诞生于 C++中,目的是为了实现 C++的 STL(标准模板库).其语言支持机制就是模板(Templates). 模板的精神其实很简单:类型参数化(type parameterized),即,类型也是一种参数,也是一种静多态. 换句话说, 把一个原本特定于某个类型的算法或类当中的类型信息抽掉,抽出来做成模板参数. 函

语言总结&mdash;C/C++

参考<程序员面试宝典> 1. 基本概念 1.1 赋值语句 例1. 按位与操作,例如:a=3,b=3,a&b值等于 0011 & 0011 结果还是0011,那么值还是3: a=4,b=3,a|b:按位或操作, 0100 | 0011 结果是0111,输出的值为7:a||b, a和b进行或运算,只要两者有一个为真则结果即为1. 例2. while(x) { count++; x=x&(x-1);} 此循环用来求输入值x转化为二进制后1的个数.eg:9(1001)&

泛型编程(模板)

;泛型编程 即是广泛的类型编程的意思,常常用于那些函数重复编写但只有参数类型或者返回值不同,常用泛型编程解决,C语言呢用宏解决 ;c++实现泛型编程用templeate模板来实现,其实就是代码的复制,当编译器扫描到模板初始化语法那么就会在当前文件中实例化一个函数或者类到本文件中,实例化的模板是存在实体的所以可以调试,而模板是不存在实体的,宏替换之后也不存在实体 函数模板(只写函数的实现而不关心其类型,类型通过外部初始化的时候增加一个叫做类型的参数来初始化一个函数模板或者类模板), 定义:每个函数