java开源代码网站/seo搜索引擎优化价格

java开源代码网站,seo搜索引擎优化价格,茶叶专卖店网站模版,做毕设的网站万目录 一.冒泡排序 二.指针类型 void* 三. qsort 1.简介 2.研究函数参数 3.怎么用? (1)排数组,升序 (2)排序结构体 四.用冒泡排序思想,模拟实现 qsort (可排序任意类型数据) 1.函数参数设计 2.在 if (cmp( )>0) 怎么传参&#x…

目录

一.冒泡排序

二.指针类型 void*

三. qsort

1.简介

 2.研究函数参数 

3.怎么用?

(1)排数组,升序

(2)排序结构体

四.用冒泡排序思想,模拟实现 qsort (可排序任意类型数据)

1.函数参数设计

2.在 if (cmp( )>0) 怎么传参?

3.怎么交换?

五.整体代码


一.冒泡排序

对数组进行排序,升序。思想:两两相邻元素比较

void bubble_sort(int arr[], int sz)
{//趟数int i = 0;for (i = 0; i < sz - 1; i++){//一趟冒泡排序的过程int j = 0;for (j = 0; j < sz - 1 - i; j++){if (arr[j] > arr[j + 1]){int tmp = arr[j];arr[j] = arr[j + 1];arr[j + 1] = tmp;}}}
}int main()
{int arr[] = { 9,8,7,6,5,4,3,2,1,0 };int sz = sizeof(arr) / sizeof(arr[0]);bubble_sort(arr, sz);//打印 0 1 2 3 4 5 6 7 8 9int i = 0;for (i = 0; i < sz; i++){printf("%d ", arr[i]);}return 0;
}

10个元素9趟,sz 个元素 sz-1 趟。

第一趟10个元素比较9次,第二趟9个元素比较8次 ......

缺点:只能排序整数。因为他的参数已经写死了,只能是整形数组。想排序字符数组、浮点型、结构体......做不到。他的功能非常有限。

二.指针类型 void*

先跳过,看完 三.2.后,回来看。

为什么 qsort 的参数写的 void*(无具体类型的指针) ?

因为:函数设计者,不知道未来你会比较什么类型的数据。

int a = 10;
float f = 5.5f;
int* p = &a;//编译器没报错
p = &f;//编译器报错:从“float *”到“int *” 的类型不兼容void* pp = &f;//不报错
pp = &a;//不报错

可以把 pp 理解为通用的指针。(垃圾桶)谁的地址往进放。

缺点:放进去,不能直接用

float f = 5.5f;
void* pp = &f;
printf("%f", *pp);

void* 类型的指针不能直接解引用。它没有具体类型,自己都不知道自己是啥类型

pp++; 也不行。无具体类型,它也不知道它 + 一步,+ 多远

当你都不知道未来别人给你传谁的地址时,用 void* 类型的指针接收

怎么用?指针类型可以转换

接着看 三.3.

三. qsort

qsort 内部的细节大家先不要关心,回头小编带大家模拟实现

1.简介

是库函数里提供的一个排序函数,底层用的是快速排序。头文件 #include <stdlib.h>

 2.研究函数参数 

一共4个参数:1.待排序数组的起始地址。2.元素个数。3.一个元素的大小(字节)。

4.(函数指针)。int (*compar)(const void* e1, const void* e2)

先分析,对上面的 bubble_sort 函数部分进行改造。希望函数可以排整型、浮点型、结构体......(任意类型数据),但还是用冒泡排序的思想,趟数和一趟比较的对数都不用变。

11-15行要变,因为:两个整型可以直接用 > 比较。但两个结构体元素不能用 > 比。

不同数据的比较方法不一样,交换方式不一样

想让他排任意类型的数据,把比较两个元素的方法抽离出来。

比如:程序员A 想排序两个整型,自己提供两个整型的比较方法;想排序结构体,自己提供两个结构体的比较方法。

再把比较的方法传进来,你按照我的方法比较这两个元素就可以。

其实,qsort 就是这么实现的。自己写个比较两个东西函数,函数的地址传给 qsort ,恰好用(*compar)这个函数指针接收。然后 qsort 里面就按照这个函数指针指向的函数来比较。注意:&函数名      函数名       都是地址

写的函数就被称为回调函数

e1 e2 分别是要比较的两个元素的地址

3.怎么用?

(1)排数组,升序

#include <stdlib.h>
cmp_int()
{ }int main()
{int arr[] = { 9,8,7,6,5,4,3,2,1,0 };int sz = sizeof(arr) / sizeof(arr[0]);qsort(arr, sz, sizeof(arr[0]), cmp_int);// 这里是函数cmp_int 的地址int i = 0;for (i = 0; i < sz; i++){printf("%d ", arr[i]);}return 0;
}

要把 cmp_int 的地址传给 qsort 所需要的(*compar) 函数指针。

cmp_int 的参数、返回类型要与 qsort 的第四个参数的函数指针的参数、返回类型 保持一致

#include <stdlib.h>//实现一个比较整形的函数
int cmp_int(const void* e1, const void* e2)
{ //(int*)e1  把e1当成整型指针了return *(int*)e1 - *(int*)e2;
}int main()
{int arr[] = { 9,8,7,6,5,4,3,2,1,0 };int sz = sizeof(arr) / sizeof(arr[0]);qsort(arr, sz, sizeof(arr[0]), cmp_int);// 这里是函数cmp_int 的地址int i = 0;for (i = 0; i < sz; i++){printf("%d ", arr[i]);}return 0;
}

cmp_int 实现了比较 e1 e2 指向的两个整型。把 cmp_int 的地址传给 qsort

qsort 就知道了,说:你让我 比较 arr 里 sz 个元素,每个元素大小为 sizeof(arr[0]),数组arr里两个元素的比较方法是 cmp_int

想降序:return *(int*)e2 - *(int*)e1;

(2)排序结构体

1.按照学生年龄排序

#include <stdlib.h>struct Stu
{char name[20];int age;
};int cmp_stu_by_age(const void* e1, const void* e2)
{// (struct Stu*)e2 - e2强制转化为结构体类型指针return ((struct Stu*)e1)->age - ((struct Stu*)e2)->age;
}int main()
{struct Stu s[3] = { {"zhangsan",20}, {"lisi", 50}, {"wangwu", 33} };int sz = sizeof(s) / sizeof(s[0]);qsort(s, sz, sizeof(s[0]), cmp_stu_by_age);return 0;
}

2.按照学生名字排序

#include <stdlib.h>
#include <string.h>
struct Stu
{char name[20];int age;
};int cmp_stu_by_name(const void* e1, const void* e2)
{return strcmp(((struct Stu*)e1)->name, ((struct Stu*)e2)->name);
}int main()
{struct Stu s[3] = { {"zhangsan",20}, {"lisi", 50}, {"wangwu", 33} };int sz = sizeof(s) / sizeof(s[0]);qsort(s, sz, sizeof(s[0]), cmp_stu_by_name);return 0;
}

四.用冒泡排序思想,模拟实现 qsort (可排序任意类型数据)

1.函数参数设计

参数1:为了能够接受任意类型地址,用 void*  。  参数2:元素个数

为什么 qsort 要传元素大小?

void* 无具体类型,只知道待排序数组元素个数,不知道一个元素占几个字节

参数3:宽度    参数4:提出比较方法

类型最好给 size_t ,个数、宽度永远是正数

//实现一个比较整型的函数
int cmp_int(const void* e1, const void* e2)
{return *(int*)e1 - *(int*)e2;
}void bubble_sort(void* base, size_t sz, size_t width, int (*cmp)(const void* e1, const void* e2))
{//趟数int i = 0;for (i = 0; i < sz - 1; i++){//一趟冒泡排序的过程int j = 0;for (j = 0; j < sz - 1 - i; j++){if (cmp() > 0){//交换}//if (arr[j] > arr[j + 1])//{//	int tmp = arr[j];//	arr[j] = arr[j + 1];//	arr[j + 1] = tmp;//}}}
}void test3()
{int arr[] = { 9,8,7,6,5,4,3,2,1,0 };int sz = sizeof(arr) / sizeof(arr[0]);bubble_sort(arr, sz, sizeof(arr[0]), cmp_int);int i = 0;for (i = 0; i < sz; i++){printf("%d ", arr[i]);}
}int main()
{test3();return 0;
}

2.在 if (cmp( )>0) 怎么传参?

相邻两元素比较,传过来要是两元素的地址。比如,传9 8地址。怎么算呢?

现在不知道里面放的什么类型的元素,没法直接用下标来搞。只能通过偏移量来算。

8的地址是 base + 几。但 base 是 void* ,不能直接加。

强制类型转换。转换成什么类型?

int ? 不行,写死了。

怎么办?9的宽度是 width,从9偏移 width 个字节来到8。怎么来到8呢?

宽度 width 的单位是字节,如果把它转换成 char* 的指针,char* 的指针+width=跳过width个字节

if(cmp((char*)base, (char*)base + width) > 0) //只是第一对元素if(cmp((char*)base + j * width, (char*)base + (j + 1) * width) > 0)
{//交换
}

if 里面是分别对应下标为 j   j+1 元素的地址,分别传给 e1   e2 指针

cmp是比较函数,e1   e2  是它比较的两个元素

我们已经把待比较的两个元素的地址传给 e1   e2 。cmp 就通过这样一个指针找到它所指向的比较函数。如果比较函数返回值 >0 就交换

3.怎么交换?

 给一个Swap 函数,把(char*)base + j * width , (char*)base + (j + 1) * width) 两个指针指向的元素交换。

交换这两个元素的宽度是多大呢?注意:我不知道我交换的两个元素多大。把 width 传过去

比较的时候都不知道比较谁,交换时也肯定不知道交换的是什么类型的数据,所以通过类型是没办法

if (cmp((char*)base + j * width, (char*)base + (j + 1) * width) > 0)
{//交换Swap((char*)base + j * width, (char*)base + (j + 1) * width, width);
}

但是注意,当我要交换两个结构体的时候。我们没办法创建出10字节的临时空间,但是可以创建一个字节的空间。

交换每一对字节,这两个元素整体也就交换了

//已经强制转换为char*,这里也不端着了,就写成char* 的指针
void Swap(char* buf1, char* buf2, int width)
{int i = 0;for (i = 0; i < width; i++){char tmp = *buf1;*buf1 = *buf2;*buf2 = tmp;buf1++;buf2++;}
}

五.整体代码

#include <stdio.h>
#include <string.h>struct Stu
{char name[20];int age;
};int cmp_stu_by_age(const void* e1, const void* e2)
{return ((struct Stu*)e1)->age - ((struct Stu*)e2)->age;
}int cmp_stu_by_name(const void* e1, const void* e2)
{return strcmp(((struct Stu*)e1)->name, ((struct Stu*)e2)->name);
}//实现一个比较整型的函数
int cmp_int(const void* e1, const void* e2)
{return *(int*)e1 - *(int*)e2;
}//已经强制转换为char*,这里也不端着了,就写成char* 的指针
void Swap(char* buf1, char* buf2, int width)
{int i = 0;for (i = 0; i < width; i++){char tmp = *buf1;*buf1 = *buf2;*buf2 = tmp;buf1++;buf2++;}
}void bubble_sort(void* base, size_t sz, size_t width, int (*cmp)(const void* e1, const void* e2))
{//趟数size_t i = 0;for (i = 0; i < sz - 1; i++){//一趟冒泡排序的过程size_t j = 0;for (j = 0; j < sz - 1 - i; j++){if (cmp((char*)base + j * width, (char*)base + (j + 1) * width) > 0){//交换Swap((char*)base + j * width, (char*)base + (j + 1) * width, width);}}}
}//使用我们自己写的bubble_sort函数排序整型数组
void test3()
{int arr[] = { 9,8,7,6,5,4,3,2,1,0 };int sz = sizeof(arr) / sizeof(arr[0]);bubble_sort(arr, sz, sizeof(arr[0]), cmp_int);int i = 0;for (i = 0; i < sz; i++){printf("%d ", arr[i]);}
}//使用我们自己写的bubble_sort函数排序结构体数组
void test4()
{struct Stu s[3] = { {"zhangsan",20}, {"lisi", 50}, {"wangwu", 33} };int sz = sizeof(s) / sizeof(s[0]);bubble_sort(s, sz, sizeof(s[0]), cmp_stu_by_age);bubble_sort(s, sz, sizeof(s[0]), cmp_stu_by_name);
}int main()
{test3();test4();return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/898452.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

电机控制常见面试问题(十四)

文章目录 一.电机信噪比二.电机零点偏移校正和极对数自适应1.零点偏移量检测​2. 极对数识别三.交流电机电流纹波怎么产生的1.电源相关因素2.电机本体特性3.​PWM逆变器谐波4.负载与环境干扰5.诊断流程建议 四.谈谈对谐波的理解1.谐波定义2.次谐波产生源3.次谐波的检测与分析4.…

系统思考—啤酒游戏经营决策沙盘模拟

再次感谢文华学院的邀请&#xff0c;为经纬集团管理层带来 《啤酒游戏经营决策沙盘》&#xff01; 很多朋友问&#xff1a;“最近是不是啤酒游戏上的少了&#xff1f;” 其实&#xff0c;真正的关键不是游戏本身&#xff0c;而是——如何让大家真正看见复杂系统中的隐性结构。 …

排序算法实现:插入排序与希尔排序

目录 一、引言 二、代码整体结构 三、宏定义与头文件 四、插入排序函数&#xff08;Insertsort&#xff09; 函数作用 代码要点分析 五、希尔排序函数&#xff08;ShellSort&#xff09; 函数作用 代码要点分析 六、打印数组函数&#xff08;PrintSort&#x…

2025-03-20 学习记录--C/C++-C 库函数 - toupper()、tolower()、 isspace()

合抱之木&#xff0c;生于毫末&#xff1b;九层之台&#xff0c;起于累土&#xff1b;千里之行&#xff0c;始于足下。&#x1f4aa;&#x1f3fb; 一、C 库函数 - toupper() ⭐️ C 标准库 - <ctype.h> C 标准库的 ctype.h 头文件提供了一些函数&#xff0c;可用于测试和…

易语言模拟真人鼠标轨迹算法

一.简介 鼠标轨迹算法是一种模拟人类鼠标操作的程序&#xff0c;它能够模拟出自然而真实的鼠标移动路径。 鼠标轨迹算法的底层实现采用C/C语言&#xff0c;原因在于C/C提供了高性能的执行能力和直接访问操作系统底层资源的能力。 鼠标轨迹算法具有以下优势&#xff1a; 模拟…

sparksql的Transformation与 Action操作

Transformation操作 与RDD类似的操作 map、filter、flatMap、mapPartitions、sample、 randomSplit、 limit、 distinct、dropDuplicates、describe&#xff0c;而以上这些都是企业中比较常用的&#xff0c;这里在一个文件中统一论述 val df1 spark.read.json("src/m…

微软Data Formulator:用AI重塑数据可视化的未来

在数据驱动的时代,如何快速将复杂数据转化为直观的图表是每个分析师面临的挑战。微软研究院推出的开源工具 Data Formulator,通过结合AI与交互式界面,重新定义了数据可视化的工作流。本文将深入解析这一工具的核心功能、安装方法及使用技巧,助你轻松驾驭数据之美。 一、Dat…

本地部署deepseek-r1建立向量知识库和知识库检索实践【代码】

目录 一、本地部署DS 二、建立本地知识库 1.安装python和必要的库 2.设置主目录工作区 3.编写文档解析脚本 4.构建向量数据库 三、基于DS,使用本地知识库检索 本地部署DS,其实非常简单,我写了一篇操作记录,我终于本地部署了DeepSeek-R1(图文全过程)-CSDN博客 安装…

String、StringBuffer、StringBuiler的区别

可变性 String是不可变的&#xff0c;这是因为String内部用于存储数据的char[]数组用了final关键字修饰&#xff0c;而且是private的&#xff0c;并且没有对外提供修改数组的方法。 StringBuffer和StringBuilder是可变的&#xff0c;它们内部的char数组没有用final关键字修饰。…

Certd自动化申请和部署SSL证书并配置https

服务器使用的华为云&#xff0c;之前SSL证书通过配置Cloudflare的DNS实现的&#xff0c;最近华为云备案提示需修改解析至境内华为云IP&#xff0c;若解析境外IP&#xff0c;域名无需备案&#xff0c;需注销或取消接入备案信息&#xff0c;改为使用Certd自搭建证书管理工具&…

git tag以及git

git tag 以及git 一、先说收获吧 1. git bash 在windows上 类似于linux的bash提供的shell命令行窗口&#xff0c;可以执行很多linux命令&#xff0c;cd pwd ls vim cat touch mkdir&#xff0c;还可以用正则匹配查看标签。相当于在windows上装了一个小的linux。git init myproj…

ESP8266通过AT指令配置双向透传

一、固件烧录 IO0接地后上电&#xff0c;进入烧录模式&#xff0c;烧录完成后去掉即可 二、参数配置 1、服务器端 ATCWMODE_DEF2 ATCWSAP_DEF"ESP8266","12345678",5,3 ATSAVETRANSLINK1,"192.168.4.2",9090,"UDP",8080 2、客户端…

【3D模型】【游戏开发】【Blender】Blender模型分享-狮头木雕附导入方法

导入方法&#xff1a; [Blender] 如何导入包含纹理的 .blend 模型文件 在 3D 建模和渲染工作中&#xff0c;Blender 是一款功能强大的免费开源软件。很多时候&#xff0c;我们需要导入 .blend 后缀的模型文件&#xff0c;同时确保纹理&#xff08;textures&#xff09;文件夹…

C# | 超简单CSV表格读写操作(轻松将数据保存到CSV,并支持读取还原)

C# | 超简单CSV表格读写操作&#xff08;轻松将数据保存到CSV&#xff0c;并支持读取还原&#xff09; 文章目录 C# | 超简单CSV表格读写操作&#xff08;轻松将数据保存到CSV&#xff0c;并支持读取还原&#xff09;一、上位机开发中的CSV应用背景二、CSV读写实战教学1. 基本对…

Unity导出WebGL,无法显示中文

问题&#xff1a;中文无法显示 默认字体无法显示中文 在编辑器中设置了中文和英文的按钮&#xff0c;中文按钮无法显示 导出后无法显示中文 解决办法&#xff1a; 自己添加字体&#xff0c;导入项目&#xff0c;并引用 示例 下载一个字体文件&#xff0c;这里使用的阿里…

阅读《Vue.js设计与实现》 -- 02

接上一篇文章&#xff1a;阅读《Vue.js设计与实现》 – 01 文章目录 第二章提升用户的开发体验tips 控制框架代码的体积Tree-Shaking副作用 框架应该输出怎样的构建产物&#xff1f;注意这两个文件有什么区别&#xff1f; 特性开关如何实现&#xff1f; 处理错误TS支持 第二章 …

Mac:Ant 下载+安装+环境配置(详细讲解)

&#x1f4cc; 下载 Ant 下载地址&#xff1a;https://ant.apache.org/bindownload.cgi &#x1f4cc; 无需安装 Apache官网下载 Ant 压缩包&#xff0c;无需安装&#xff0c;下载解压后放到自己指定目录下即可。 按我自己的习惯&#xff0c;我会在用户 jane 目录下新建了个…

蓝桥杯国赛子串2023动态规划,暴力

#include <bits/stdc.h> using namespace std; // string ss; #define int long long string s; //该方法通过动态规划&#xff0c;找到2023字串&#xff0c;而2023等于202加3&#xff0c;202等于202&#xff0c;20等于20&#xff1b; int f2() {int dp[4]{0};//dp[0]代表…

Vue3项目开发:状态管理实践指南

# Vue3项目开发&#xff1a;状态管理实践指南 一、引言 背景介绍 在Vue项目中&#xff0c;状态管理是一个非常重要的话题。合理的状态管理能够帮助我们更好地组织和管理数据&#xff0c;提升项目的可维护性和可扩展性。本文将深入探讨Vue3项目中状态管理的最佳实践&#xff0c;…

网络安全漏洞与修复 网络安全软件漏洞

文章目录 一、软件漏洞的概念 1、信息安全漏洞简述2、软件漏洞3、软件漏洞概念4、软件漏洞的成因分析 二、软件漏洞标准化管理 1、软件漏洞分类2、软件漏洞分级3、安全漏洞管理规范 一、软件漏洞的概念 1、信息安全漏洞简述 信息安全漏洞是信息安风险的主要根源之一&…