题目:编写一个函数,它用于对一个任何类型的数组进行排序。

算法核心代码sort函数实现

/**
功能说明:sort函数可以对不同类型的数据进行排序
参数:
1、一个指向需要排序的数组的第一个值的指针。
2、数组中元素的个数。
3、每个数组元素的长度。
4、一个指向比较回调函数的指针
**/
void sort(void *array,int size,int element_size,int (*cmp)(void const *a,void const *b))
{
char *pc = (char *)array;//默认void *大小未知,这里把它存入字符指针下
//简单的冒泡排序 这里可以用更高级的算法实现,这里采用了简单的冒泡排序
for(int i = ; i < size; i++)
for(int j = ; j < size-i; j++)
{
if(cmp(pc+(j-)*element_size,pc+j*element_size) < )
{
void *p = malloc(element_size);//分配一个string大小的内存
//交换两个元素,借助于和中间变量p,由于具体类型未知,这里借助于内存cpy函数拷贝内存内的内容
memcpy(p,pc+j*element_size,element_size);
memcpy(pc+j*element_size,pc+(j-)*element_size,element_size);
memcpy(pc+(j-)*element_size,p,element_size);
free(p);//临时变量使用完毕后,记得释放,不然容易造成内存泄露
}
}
}

字符串比较函数,这里是第二个大于第一个返回值大于0,相等等于0,第二个数小于第一个返回值小于0

//string 比较
int string_cmp(void const *a,void const *b)
{
char *num1 = (char *)a;
char *num2 = (char *)b;
assert(num1 != NULL && num2 != NULL);
while(*num1 != '\0' && *num2 != '\0')
{
if(*num1 == *num2)
{
num1++;
num2++;
continue;
}
break;
}
return *num2-*num1; }

测试代码,全部代码

/*************************************************************************
> File Name: sort.c
> Created Time: 2014年06月17日 星期二 23时22分34秒
************************************************************************/ #include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#include<string.h> /**
功能说明:sort函数可以对不同类型的数据进行排序
参数:
1、一个指向需要排序的数组的第一个值的指针。
2、数组中元素的个数。
3、每个数组元素的长度。
4、一个指向比较回调函数的指针
**/
void sort(void *array,int size,int element_size,int (*cmp)(void const *a,void const *b))
{
char *pc = (char *)array;//默认void *大小未知,这里把它存入字符指针下
//简单的冒泡排序 这里可以用更高级的算法实现,这里采用了简单的冒泡排序
for(int i = ; i < size; i++)
for(int j = ; j < size-i; j++)
{
if(cmp(pc+(j-)*element_size,pc+j*element_size) < )
{
void *p = malloc(element_size);//分配一个string大小的内存
//交换两个元素,借助于和中间变量p,由于具体类型未知,这里借助于内存cpy函数拷贝内存内的内容
memcpy(p,pc+j*element_size,element_size);
memcpy(pc+j*element_size,pc+(j-)*element_size,element_size);
memcpy(pc+(j-)*element_size,p,element_size);
free(p);//临时变量使用完毕后,记得释放,不然容易造成内存泄露
}
}
} //int比较
int int_cmp(void const *a,void const *b)
{
int *num1 = (int *)a;
int *num2 = (int *)b;
if(*num1 == *num2)return ;
else return *num2-*num1;
}
//double比较
int double_cmp(void const *a,void const *b)
{
double *num1 = (double *)a;
double *num2 = (double *)b;
if(*num1 == *num2)return ;
else return *num2-*num1;
} //char 比较
int char_cmp(void const *a,void const *b)
{
char *num1 = (char *)a;
char *num2 = (char *)b;
if(*num1 == *num2)return ;
else return *num2-*num1;
} //string 比较
int string_cmp(void const *a,void const *b)
{
char *num1 = (char *)a;
char *num2 = (char *)b;
assert(num1 != NULL && num2 != NULL);
while(*num1 != '\0' && *num2 != '\0')
{
if(*num1 == *num2)
{
num1++;
num2++;
continue;
}
break;
}
return *num2-*num1; } int main()
{ //int 数组
int array[] = {,,,,,};
printf("int 数组排序前:\n");
for(int i = ; i < ; i++)
printf("%d ",array[i]);
printf("\n");
sort(array,,sizeof(int),int_cmp);
printf("int 数组排序后:\n");
for(int i = ; i < ; i++)
printf("%d ",array[i]);
printf("\n"); //double 数组
double array_d[] = {3.16,2.5,6.49,10.5,0.4};
printf("double 数组排序前:\n");
for(int i = ; i < ; i++)
printf("%lf ",array_d[i]);
printf("\n");
sort(array_d,,sizeof(double),double_cmp);
printf("double 数组排序后:\n");
for(int i = ; i < ; i++)
printf("%lf ",array_d[i]);
printf("\n"); //char
char array_c[] = {'E','C','A','D','B'};
printf("char 数组排序前:\n");
for(int i = ; i < ; i++)
printf("%c ",array_c[i]);
printf("\n");
sort(array_c,,sizeof(char),char_cmp);
printf("char 数组排序后:\n");
for(int i = ; i < ; i++)
printf("%c ",array_c[i]);
printf("\n");
//string 数组排序
char array_s[][] = {"yello","world","herb","herd","sort"};
printf("string 数组排序前:\n");
for(int i = ; i < ; i++)
printf("%s ",array_s[i]);
printf("\n");
sort(array_s,,sizeof(char)*,string_cmp);
printf("string 数组排序后:\n");
for(int i = ; i < ; i++)
printf("%s ",array_s[i]);
printf("\n"); return ;
}

运行结果:

C和指针第13章第4题的更多相关文章

  1. C和指针第七章第五题

    实现一个简化的printf函数,能够处理%d,%f,%s,%c等格式. /*************************************************************** ...

  2. Linux就这个范儿 第13章 打通任督二脉

    Linux就这个范儿 第13章 打通任督二脉 0111010110……你有没有想过,数据从看得见或看不见的线缆上飞来飞去,是怎么实现的呢?数据传输业务的未来又在哪里?在前面两章中我们学习了Linux网 ...

  3. 【STM32H7教程】第13章 STM32H7启动过程详解

    完整教程下载地址:http://forum.armfly.com/forum.php?mod=viewthread&tid=86980 第13章       STM32H7启动过程详解 本章教 ...

  4. 【RL-TCPnet网络教程】第13章 RL-TCPnet之TCP服务器

    第13章      RL-TCPnet之TCP服务器 本章节为大家讲解RL-TCPnet的TCP服务器实现,学习本章节前,务必要优先学习第12章TCP传输控制协议基础知识.有了这些基础知识之后,再搞本 ...

  5. 第13章 GPIO—位带操作

    第13章     GPIO—位带操作 全套200集视频教程和1000页PDF教程请到秉火论坛下载:www.firebbs.cn 野火视频教程优酷观看网址:http://i.youku.com/fire ...

  6. 第13章 GPIO-位带操作—零死角玩转STM32-F429系列

    第13章     GPIO—位带操作 全套200集视频教程和1000页PDF教程请到秉火论坛下载:www.firebbs.cn 野火视频教程优酷观看网址:http://i.youku.com/fire ...

  7. C++ primer plus读书笔记——第13章 类继承

    第13章 类继承 1. 如果购买厂商的C库,除非厂商提供库函数的源代码,否则您将无法根据自己的需求,对函数进行扩展或修改.但如果是类库,只要其提供了类方法的头文件和编译后的代码,仍可以使用库中的类派生 ...

  8. ASM:《X86汇编语言-从实模式到保护模式》第13章:保护模式下内核的加载,程序的动态加载和执行

    ★PART1:32位保护模式下内核简易模型 1. 内核的结构,功能和加载 每个内核的主引导程序都会有所不同,因为内核都会有不同的结构.有时候主引导程序的一些段和内核段是可以共用的(事实上加载完内核以后 ...

  9. 《深入Java虚拟机学习笔记》- 第13章 逻辑运算

    <深入Java虚拟机学习笔记>- 第13章 浮点运算

随机推荐

  1. Centos7.4下keepalived-1.3.5的安装使用

    keepalived两个功能,一个是使lvs使用的vip高可用,一个是监控下游各个子节点的对应端口是否正常工作,以保证快速剔除坏掉的节点. keepalived默认的yum 1.3.5有BUG,根本跑 ...

  2. Libevent官方代码样例学习(二)

    连接监听器: 接收TCP连接请求 evconnlistener机制用于监听并接受TCP连接请求. 这些方法在event2/listener.h中声明, 在Libevent 2.0.2-alpha之后的 ...

  3. 转:Linux网卡驱动程序编写

    Linux网卡驱动程序编写 [摘自 LinuxAID] 工作需要写了我们公司一块网卡的Linux驱动程序.经历一个从无到有的过程,深感技术交流的重要.Linux作为挑战微软垄断的强有力武器,日益受到大 ...

  4. Oracle Tuxedo工作站客户端与服务端的样例程序

    服务端代码: #include <stdio.h> #include <stdlib.h> #include <string.h> #include <cty ...

  5. 【公众号】微信第三方登录(静默授权和非静默授权)(具体代码:U盘 新浪云SAE)

    一.微信联合登录是怎么登录的,有几种登录方式:微信联合登录和微信授权登录[授权登录(非静默授权)与静默授权] [主动授权]:需要用户确认登录,这样可以通过用户的个人确认,获取用户全面的信息,无论是否关 ...

  6. firefox插件卸载

    1.根据插件名进行搜索,搜索到相关dll后删除,重启firefox. 2.about:config--plugin.expose_full_path:true,然后about:plugins去查看插件 ...

  7. Windows phone 应用开发系列教程(更新中)

    Windows phone 应用开发[1]-Text To Speech        作为开篇章节.第一篇将在如下介绍一些Windows phone比较有意思的东西-Text To Speech[文 ...

  8. C# 使用系统方法发送异步邮件

    项目背景: 最近在对几年前的一个项目进行重构,发现发送邮件功能需要一定的时间来处理,而由于发送是同步的因此导致在发送邮件时无法执行后续的操作 实际上发送邮件后只需要将发送结果写入系统日志即可对其他业务 ...

  9. Checkstyle-Configuration

    <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE module PUBLIC "-/ ...

  10. 高并发分布式系统中生成全局唯一(订单号)Id js返回上一页并刷新、返回上一页、自动刷新页面 父页面操作嵌套iframe子页面的HTML标签元素 .net判断System.Data.DataRow中是否包含某列 .Net使用system.Security.Cryptography.RNGCryptoServiceProvider类与System.Random类生成随机数

    高并发分布式系统中生成全局唯一(订单号)Id   1.GUID数据因毫无规律可言造成索引效率低下,影响了系统的性能,那么通过组合的方式,保留GUID的10个字节,用另6个字节表示GUID生成的时间(D ...