当前位置: 首页 > news >正文

山东省旅游网站建设网络设计是干什么的工作

山东省旅游网站建设,网络设计是干什么的工作,天津艺匠做网站怎么样,百度官网认证多少钱在C语言的学习与应用中&#xff0c;排序是一个非常基础且重要的算法。今天&#xff0c;我们就来深入探讨如何使用C语言实现一个通用的排序函数&#xff0c;通过这个过程&#xff0c;我们将对指针和函数指针有更深刻的理解。 #define _CRT_SECURE_NO_WARNINGS #include<std…

在C语言的学习与应用中,排序是一个非常基础且重要的算法。今天,我们就来深入探讨如何使用C语言实现一个通用的排序函数,通过这个过程,我们将对指针和函数指针有更深刻的理解。

#define _CRT_SECURE_NO_WARNINGS

#include<stdio.h>

int cmp_int(const void* e1, const void* e2)

{

 return *(int*)e1 - *(int*)e2;

}

void swap(char* buff1, char* buff2,int width)

{

 for (int i = 0;i < width; i++)

 {

  char tmp = *buff1;

  *buff1 = *buff2;

  *buff2 = tmp;

  buff1++;

  buff2++;

 }

}

void my_sort(void* arr, int sz, int width, int(*cmp)(const void* e1, const void* e2))

{

 for (int i = 0;i < sz;i++)

 {

  int flag = 1;

  for (int j = 0;j < sz - 1 - i;j++)

  {

   if (cmp((char*)arr + j * width, (char*)arr + (j + 1) * width) > 0)

   {

    swap((char*)arr + j * width, (char*)arr + (j + 1) * width, width);

    flag = 0;

   }

  }

  if (flag == 1)

  {

   break;

  }

 }

}

void print(int arr[], int sz)

{

 for (int i = 0;i < sz;i++)

 {

  printf("%2d", arr[i]);

 }

}

void test1()

{

 int arr[] = { 9,8,7,5,6,4,3,2,1 };

 int sz = sizeof(arr) / sizeof(arr[0]);

 my_sort(arr, sz, sizeof(arr[0]), cmp_int);

 print(arr, sz);

}

int main()

{

 test1();

 return 0;

}

 这个代码是为了构造一个类似qsort功能的程序

代码剖析

 

预处理指令

#define _CRT_SECURE_NO_WARNINGS

#include<stdio.h>

这段代码中, #define _CRT_SECURE_NO_WARNINGS 用于忽略Visual Studio中关于 scanf 等函数不安全的警告, #include<stdio.h> 则包含了标准输入输出函数库的头文件,为后续的输入输出操作提供支持。

 

比较函数

int cmp_int(const void* e1, const void* e2)

{

    return *(int*)e1 - *(int*)e2;

}

 cmp_int 函数是一个比较函数,用于比较两个 int 类型的元素。它接受两个 const void* 类型的指针,这是因为通用排序函数需要处理不同类型的数据。在函数内部,通过强制类型转换将指针转换为 int* 类型,然后进行减法运算,返回结果用于判断两个元素的大小关系。如果 e1 大于 e2 ,返回正数;如果 e1 小于 e2 ,返回负数;如果相等,返回0。

 

交换函数

void swap(char* buff1, char* buff2, int width)

{

    for (int i = 0; i < width; i++)

    {

        char tmp = *buff1;

        *buff1 = *buff2;

        *buff2 = tmp;

        buff1++;

        buff2++;

    }

}

 swap 函数用于交换两个内存区域的数据。它接受两个 char* 类型的指针和一个表示数据宽度的整数 width 。由于要处理不同类型的数据,所以使用 char* 指针,因为 char 类型是C语言中最小的可寻址单位。通过循环,每次交换一个字节的数据,直到交换完整个数据宽度。

 

通用排序函数

void my_sort(void* arr, int sz, int width, int(*cmp)(const void* e1, const void* e2))

{

    for (int i = 0; i < sz; i++)

    {

        int flag = 1;

        for (int j = 0; j < sz - 1 - i; j++)

        {

            if (cmp((char*)arr + j * width, (char*)arr + (j + 1) * width) > 0)

            {

                swap((char*)arr + j * width, (char*)arr + (j + 1) * width, width);

                flag = 0;

            }

        }

        if (flag == 1)

        {

            break;

        }

    }

}

 

 my_sort 函数是整个代码的核心,它实现了一个通用的冒泡排序算法。它接受四个参数:

 

 void* arr :指向待排序数组的指针, void* 类型可以指向任何类型的数据。

 

 int sz :数组的元素个数。

 

 int width :每个元素的字节宽度,用于正确地访问和交换数据。

 

 int(*cmp)(const void* e1, const void* e2) :一个函数指针,指向用于比较两个元素的函数。

 

在函数内部,通过两层循环实现冒泡排序。外层循环控制排序轮数,内层循环用于比较相邻元素并进行交换。如果在某一轮中没有发生交换,说明数组已经有序,提前结束排序。

 

打印函数

void print(int arr[], int sz)

{

    for (int i = 0; i < sz; i++)

    {

        printf("%2d", arr[i]);

    }

}

 

 

 print 函数用于打印数组中的元素,它接受一个 int 类型的数组和数组的大小,通过循环遍历数组并使用 printf 函数输出每个元素。

 

测试函数与主函数

void test1()

{

    int arr[] = { 9,8,7,5,6,4,3,2,1 };

    int sz = sizeof(arr) / sizeof(arr[0]);

    my_sort(arr, sz, sizeof(arr[0]), cmp_int);

    print(arr, sz);

}

 

int main()

{

    test1();

    return 0;

}

 test1 函数用于测试 my_sort 函数的功能,它定义了一个 int 类型的数组,并调用 my_sort 函数对其进行排序,然后调用 print 函数输出排序后的数组。 main 函数则是程序的入口,它调用 test1 函数开始测试。

 

总结

通过这个通用排序函数的实现,我们不仅掌握了冒泡排序的基本原理,还学会了如何使用指针和函数指针来实现代码的通用性。这种编程技巧在实际开发中非常有用,可以提高代码的复用性和可维护性。希望大家通过这篇博客,对C语言的指针和函数指针有更深入的理解,在今后的编程中能够灵活运用。

http://www.dtcms.com/a/456846.html

相关文章:

  • 基于 ZYNQ ARM+FPGA+AI YOLOV4 的电网悬垂绝缘子缺陷检测系统的研究
  • 开源 C++ QT QML 开发(十二)通讯--TCP客户端
  • 【密码学实战】openHiTLS pkeyutl命令行:公钥实用工具(加解密、密钥交换)
  • 做标书有什么好的网站吗网站改版不收录
  • JDK17和JDK8的 G1
  • win10安装conda环境
  • TDengine 浮点数新编码 BSS 用户手册
  • mybatis call存储过程,out的参数怎么返回
  • 今日八股——JVM篇
  • 【论文阅读】REACT: SYNERGIZING REASONING AND ACTING IN LANGUAGE MODELS
  • 沈阳做网站比较好的公司做网站需要会的软件
  • ubuntu22.04安装gvm管理go
  • 基于单片机的智能点滴输液速度与液位控制系统设计
  • 嵌入式开发学习日志38——stm32之看门狗
  • golang面经——内存相关模块
  • 成都政务网站建设怎样做视频网站
  • 架构设计常画哪些图
  • 自然语言处理分享系列-词向量空间中的高效表示估计(一)
  • RNN的注意力机制:原理与实现(代码示例)
  • Flutter bottomNavigationBar 底部导航栏
  • 做男装去哪个网站好的网站开发工具有哪些
  • 【Spring 3】深入剖析 Spring 的 Prototype Scope:何时以及如何使用非单例 Bean
  • asp.net+mvc+网站开发wordpress 手机端页面
  • 【开题答辩全过程】以 爱篮球app为例,包含答辩的问题和答案
  • 深入理解跨域问题与解决方案
  • 从零搭建 RAG 智能问答系统1:基于 LlamaIndex 与 Chainlit实现最简单的聊天助手
  • Redis核心通用命令解析
  • 后端(JavaWeb)学习笔记(CLASS 1):maven
  • 后端_Redis 分布式锁实现指南
  • K8s学习笔记(十六) 探针(Probe)