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

算法核心代码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. String类原理分析及部分方法

    //String类原理分析及部分方法 //http://www.cnblogs.com/vamei/archive/2013/04/08/3000914.html //http://www.cnblo ...

  2. windows用户态程序的Dump

    熟悉Linux的开发人员都知道,在Linux下开发程序,如果程序崩溃了,可以通过配置Core Dump,来让程序崩溃的瞬间产生一个Dump文件,然后通过dump文件来调试程序为什么崩溃.但是windo ...

  3. (原)python中不同文件之间使用所谓的全局变量

    转载请注明出处: http://www.cnblogs.com/darkknightzh/p/8108640.html 参考网址: https://www.cnblogs.com/20150705-y ...

  4. java hibernate session create

    public class RegisterStory { private SysUserCDao sysUserCDao; @Test public void test() { SessionFact ...

  5. Windows系统使用vbs脚本或bat脚本强制杀死指定所有进程 vbs实现循环持续写入内容到vbs打开开的记事本 使用vbs、bat添加windows计划任务 使用cmd schtasks命令添加windows计划任务

    以下脚本windows7下成功运行过,脚本也可以windows计划任务程序一起组合使用 新建一个记事本文档粘贴下面代码后将新建的记事本文档重命名下面对应的脚本名就能使用了: 添加windows计划任务 ...

  6. Error 25007.初始化合成时发生错误。安装程序无法使用 LoadLibraryShim() 加载合成。

    安装“Microsoft .NET Framework 2.exe”报错如下: c:\windows\microsoft.net\framework\...类似这种错误都因 .NET Framewor ...

  7. Eclipse中创建Maven多模块工程

    1.先创建父项目 在Eclipse里面New -> Maven Project: 在弹出界面中选择“Create a simple project” 这样,我们就按常规模版创建了一个Maven工 ...

  8. Docker LNMP环境搭建

    原文地址:https://www.awaimai.com/2120.html 1 快速使用 2 安装docker和docker-compose 3 使用国内镜像仓库 4 目录说明 4.1 目录结构 4 ...

  9. Swift 多态

    前言 同样的操作或者方法,不同的对象在执行时会出现完全不同的行为,这就叫多态. 1.Swift 多态 多态是讲具有同样的父类的一批类之间,都重写了父类的同一个方法实现自己的行为,但是表现出来则各不相同 ...

  10. 解决Android中多次点击(快速点击多次 )启动多个相同界面的问题

    通过以下代码可以解决这个问题. /** * 防止快速点击 * @param ev * @return */ @Override public boolean dispatchTouchEvent(Mo ...