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

算法核心代码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. django之 文件上传功能(缺陷:无法改存放目录)

    百度云盘:django之 文件上传功能(缺陷:无法改存放目录)

  2. Redis从入门到精通:初级篇(转)

    原文链接:http://www.cnblogs.com/xrq730/p/8890896.html,转载请注明出处,谢谢 Redis从入门到精通:初级篇 平时陆陆续续看了不少Redis的文章了,工作中 ...

  3. GDALBuildVRT异构波段的支持

    目录 简述 修改源码 1.修改DatasetProperty结构体 2.修改VRTBuilder::AnalyseRaster函数 3.修改VRTBuilder::CreateVRTNonSepara ...

  4. Spring Cloud Eureka集群 动态扩展新节点

    场景描述: Eureka的集群节点有两个,互相注册形成集群,已经支持动态刷新(不知道怎么让Eureka支持动态刷新的可以参考http://www.cnblogs.com/flying607/p/845 ...

  5. CentOS7 下 配置Docker远程访问 与 windows下使用maven构筑Spring Boot 的 Docker镜像到远程服务端

    1.设置Docker服务端,以支持远程访问: 修改docker服务端配置文件,命令: vim /usr/lib/systemd/system/docker.service 修改后: [Unit] De ...

  6. 完美解决office2013 错误1402

    遇到1402问题  按照网络上的帖子都无法解决,老提示无权限更改,原来只是少了一个步骤而已!经本人多次试验,已经完美解决,现在上图! 步骤  肯定是得先出现错误,找到注册表所在项! 这个就不赘述,通过 ...

  7. RHEL7 在不同的环境中使用不同的网络配置文件

    比如,我们可以设置RHEL7 系统在公司时使用一个网卡配置文件:在家时则使用另外一个配置文件(可以根据不同的环境设置多个网卡配置文件). 网卡配置信息如下: [root@rhel7 ~]# nmcli ...

  8. Inno Setup入门(五)——添加readme文件

    这个实现起来很简单,就是在[files]段中的某个预先作为readme的文件后面添加标志位isreadme: [setup] ;全局设置,本段必须 AppName=Test AppVerName=TE ...

  9. UVa 10029 - Edit Step Ladders

    題目:已知一些字典序排列的單詞,問能從中找到最大的一個有序單詞集合, 使得集合中的單詞每一個是有上一個單詞經過一次變換得來的(增.刪.改). 分析:dp,LIS.最大遞增子序列,不過數據較大须要優化. ...

  10. js template实现方法

    <script type="text/html" id="template"> <li class="list-item" ...