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

【C语言】用冒泡排序实现my_qsort

大家好,我是苏貝,本篇博客带大家了解如何用冒泡排序实现my_qsort,如果你觉得我写的还不错的话,可以给我一个赞👍吗,感谢❤️
在这里插入图片描述


目录

  • 一. 前言
  • 二. 冒泡排序
  • 三. 4个参数
    • 3.1 第一个参数void* base
    • 3.2 第二个参数szie_t num
    • 3.3 第三个参数szie_t size
    • 3.4 第四个参数int ( * cmp)(const void* e1,const void* e2)
  • 四. bubble_sort函数
  • 五. 排序
    • 5.1 对整型数组排序(char/short/int/long)
  • 5.2 对浮点型数组排序(float/double)
    • 5.3 对字符串长度排序
    • 5.4 对字符串大小排序
    • 5.5 对结构体排序

一. 前言

用冒泡排序实现my_qsort?你或许觉得没有必要这样做,有现成的qsort函数,为什么还要自己写一个呢?于我而言,它可以让我对冒泡排序和qsort函数的印象加深。至于这到底有没有用,仁者见仁,智者见智吧。好了,就说这么多,现在让我们来回忆一下什么是冒泡排序和qsort函数。了解qsort函数


二. 冒泡排序

冒泡排序的原理:从左往右,依次比较相邻元素的大小,若符合条件,则两元素位置交换,每一趟可以找出最大值或最小值,并显示在序列的最右边。注意:冒泡排序只能排序整形序列,而qsort函数可以排序任意类型的序列

以想要升序排序为例,数组{5,2,4,3},条件:如果相邻元素的左边>右边,则两元素位置交换。第一趟:5>2,交换位置。5>4,交换位置。5>3,交换位置。所以第一趟结束后数组为{2,4,3,5}。第二趟:2<4,不符合条件,位置不变。4>3,交换位置。所以第二趟结束后数组为{2,3,4,5}。第三趟,2<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 };int sz = sizeof(arr) / sizeof(arr[0]);bubble_sort(arr, sz);int i = 0;for (i = 0; i < sz; i++){printf("%d ", arr[i]);}printf("\n");
}

结果为:
在这里插入图片描述


三. 4个参数

3.1 第一个参数void* base

回顾上面的bubble_sort函数,它的第一个参数是int arr[ ],也可以写成int* arr,意思是接受一个整形数组的首元素地址。可是我们想要的是能接受任意类型的指针,所以用int* 就不合适,采用void* (void* 能接受任意类型的指针) ,所以第一个参数写为void* base

3.2 第二个参数szie_t num

上面的bubble_sort函数的第二个参数是int sz,代表数组有多少个元素,其实用int sz也可以,只是如果我们想更贴近qsort函数的话,将int改成size_t(无符号整型)也没有问题,写成szie_t num

3.3 第三个参数szie_t size

上面的bubble_sort函数并没有第三个参数,但是qsort函数有,意思是数组中的一个元素占多少个字节。因为我们不知道要排序的数组是什么类型的,所以如果没有第三个参数,我们无法表示出除首元素以外的地址,也就无法交换相邻元素

3.4 第四个参数int ( * cmp)(const void* e1,const void* e2)

第四个参数是用来判断相邻元素的关系,不能直接使用>,<,=的原因是如果我们想排序多个字符串,那么我们是不能使用>,<,=的,我们需要使用strcmp函数。不同类型的数组排序的函数可能不一样,像qsort函数一样,程序员又不知道用户想要排序的是什么类型的数组,所以程序员只能用函数指针cmp来接收用户自己写的cmp函数,而用户当然知道自己想要排序的数组的类型,所以用户能写出判断相邻元素的关系的函数

cmp函数的细节:
1.e1和e2是相邻元素的地址,被const修饰,保护e1和e2不能被修改
2.因为不知道排序的数组是什么类型的,所以e1和e2都是void * 类型的
3.如果相邻元素的左边>右边,返回>0的数;左边==右边,返回0;左边<右边,返回<0的数。所以返回值的类型为int

void bubble_sort(void* base, size_t num, size_t size, int (*cmp)(const void* e1,const void* e2))
{}

四. bubble_sort函数

虽然函数的参数变化了很多,但函数原理并没有改变,依旧是比较相邻元素的大小,若符合条件,则两元素位置交换,每一趟可以找出最大值或最小值,并显示在序列的最右边。所以下面的框架不变(只将之前的sz变成了num),变得只是第二个for循环里面的内容,而里面的内容就是判断相邻元素的左边是否大于右边(以想要升序排序为例),如果是则交换位置,否则位置不变

void bubble_sort(void* base, size_t num, size_t size, int (*cmp)(const void* e1,const void* e2))
{int i = 0;//排几趟for (i = 0; i < num - 1; i++){int j = 0;//一趟排几次for (j = 0; j < num - 1 - i; j++){}}
}

好的,那我们现在就想办法如何填写里面的代码,先是判断相邻元素的大小,用cmp函数,函数的两个参数分别为相邻元素的地址。那它们的地址该如何表示呢?首元素地址就是base,不用多说,那第二个元素呢?base+1?不行,我们不知道base的具体类型,所以base+1不知道会跳过几个字节。
那不妨将base强制类型转化为char* ,这样第二个元素(下标为1)的地址为(char*)base+1* size,第三个元素(下标为2)的地址为(char*)base+2* size,所以下标为j的地址为(char*)base+ j * size,代码为:

if (cmp((char*)base + j * size, (char*)base + (j + 1) * size) > 0)
{}

好的,那我们继续完善if语句后面的代码,代码的目的是将两元素交换位置,编写swap函数实现交换功能,swap函数的第一、二个参数自然是相邻元素的地址,即(char*)base + j * size, (char*)base + (j + 1) * size,它们都是char * 类型的,所以用两个char * 类型的指针来接收。
但问题又来了,我们平时实现a与b交换,是通过一个变量c来进行的,如下:

	int a = 10;int b = 20;int c = a;a = b;b = c;

上面能交换的原因是我们知道了a和b的类型都是int,所以再创造一个int类型的变量作它们的中转站,即可实现交换。但我们事先并不知道数组的类型,所以不能创建一个和数组同类型的变量实现交换。那不如将两元素的每一个字节都交换(如下图),刚好它们是用char * 指针buf1、buf2来接收的,buf1++,buf2++即可访问两元素的每一个字节,因此我们也需要数组元素的字节数size作为swap函数的第三个参数
在这里插入图片描述
所以if语句后面的代码为:

swap((char*)base + j * size, (char*)base + (j + 1) * size, size);

swap函数:

void swap(char* buf1, char* buf2, size_t size)
{int i = 0;for (i = 0; i < size; i++){char tmp = *buf1;*buf1 = *buf2;*buf2 = tmp;buf1++;buf2++;}
}

所以bubble_sort函数的全部代码为:

void bubble_sort(void* base, size_t num, size_t size, int (*cmp)(const void* e1,const void* e2))
{int i = 0;//排几趟for (i = 0; i < num - 1; i++){int j = 0;//一趟排几次for (j = 0; j < num - 1 - i; j++){if (cmp((char*)base + j * size, (char*)base + (j + 1) * size) > 0){swap((char*)base + j * size, (char*)base + (j + 1) * size, size);}}}
}

五. 排序

对任意类型的数组排序都需要下面的代码,故把这些代码单独放在最前面,其余的main函数和cmp函数都因数组类型的变化而有所改变,所以将main函数和cmp函数单独写出来

void swap(char* buf1, char* buf2, size_t size)
{int i = 0;for (i = 0; i < size; i++){char tmp = *buf1;*buf1 = *buf2;*buf2 = tmp;buf1++;buf2++;}
}void bubble_sort(void* base, size_t num, size_t size, int (*cmp)(const void* e1,const void* e2))
{int i = 0;//排几趟for (i = 0; i < num - 1; i++){int j = 0;//一趟排几次for (j = 0; j < num - 1 - i; j++){if (cmp((char*)base + j * size, (char*)base + (j + 1) * size) > 0){swap((char*)base + j * size, (char*)base + (j + 1) * size, size);}}}
}

5.1 对整型数组排序(char/short/int/long)

字符在内存中存储的是字符的ASCII码值,ASCII码是整型,所以char的写法同int

void cmp_int(const void* e1, const void* e2)
{return *(int*)e1 - *(int*)e2;//升序//return *(int*)e2 - *(int*)e1;//降序
}int main()
{int arr[] = { 9,8,7,6,5,4,3,2,1 };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]);}printf("\n");return 0;
}

在这里插入图片描述

5.2 对浮点型数组排序(float/double)

void cmp_double(const void* e1, const void* e2)
{return *(double*)e1 > *(double*)e2 ? 1 : -1;//升序//return *(double*)e1 < *(double*)e2 ? 1 : -1;
}int main()
{double arr[] = { 3.2 ,4.5, 2.4, 1.3 };int sz = sizeof(arr) / sizeof(arr[0]);//升序bubble_sort(arr, sz, sizeof(arr[0]), cmp_double);//打印数组int i = 0;for (i = 0; i < sz; i++){printf("%lf ", arr[i]);}printf("\n");return 0;
}

在这里插入图片描述

5.3 对字符串长度排序

void cmp_string(const void* e1, const void* e2)
{return strlen((char*)e1) - strlen((char*)e2);//升序//return strlen((char*)e2) - strlen((char*)e1);//降序
}int main()
{char arr[][20] = { "helloworld","yes,sir","dian ge zan ba" };int sz = sizeof(arr) / sizeof(arr[0]);bubble_sort(arr[0], sz, sizeof(arr[0]), cmp_string);int i = 0;for (i = 0; i < sz; i++)printf("%s\n", arr[i]);return 0;
}

在这里插入图片描述

5.4 对字符串大小排序

void cmp_string(const void* e1, const void* e2)
{return strcmp((char*)e1, (char*)e2);//升序//return strcmp((char*)e2, (char*)e1);//降序
}int main()
{char arr[][20] = { "helloworld","yes,sir","dian ge zan ba" };int sz = sizeof(arr) / sizeof(arr[0]);//升序bubble_sort(arr, sz, sizeof(arr[0]), cmp_string);//打印数组int i = 0;for (i = 0; i < sz; i++){printf("%s\n", arr[i]);}printf("\n");return 0;
}

在这里插入图片描述

5.5 对结构体排序

struct Stu
{char name[20];int age;
};void cmp_stu_by_age(const void* e1, const void* e2)
{return ((struct Stu*)e1)->age - ((struct Stu*)e2)->age;//升序//return ((struct Stu*)e2)->age - ((struct Stu*)e1)->age;//降序
}int main()
{struct Stu arr[] = { {"zhang",20},{"lisi",10},{"wangwu",30} };int sz = sizeof(arr) / sizeof(arr[0]);//升序bubble_sort(arr, sz, sizeof(arr[0]), cmp_stu_by_age);//打印int i = 0;for (i = 0; i < sz; i++){printf("%s\t", arr[i].name);printf("%d\n", arr[i].age);}printf("\n");return 0;
}

在这里插入图片描述


好了,那么本篇博客就到此结束了,如果你觉得本篇博客对你有些帮助,可以给个大大的赞👍吗,感谢看到这里,我们下篇博客见❤️

相关文章:

【C语言】用冒泡排序实现my_qsort

大家好&#xff0c;我是苏貝&#xff0c;本篇博客带大家了解如何用冒泡排序实现my_qsort&#xff0c;如果你觉得我写的还不错的话&#xff0c;可以给我一个赞&#x1f44d;吗&#xff0c;感谢❤️ 目录 一. 前言二. 冒泡排序三. 4个参数3.1 第一个参数void* base3.2 第二个参数…...

【css】深入理解flex属性

参考文章&#xff1a; 深入理解Flex属性 flex弹性布局教程-05-项目属性flex-shrink flex&#xff1a;flex-grow flex-shrink flex-basis flex&#xff1a;0 1 0 如何计算flex布局&#xff0c;有flex-shrink和flex-grow的情况下&#xff0c;每个元素的大小 flex-grow生效公式如…...

前端项目开发流程

一 参加需求对称(评审)会议 时间&#xff1a;在产品设计完成以后&#xff0c;进入正式的开发流程之前 组织者&#xff1a;产品&项目经理 目的&#xff1a;统一大家对产品的认识&#xff0c;及时发现产品设计缺陷&#xff0c;尽可能降低后续修改需求的频率 参与者&#xff…...

MybatisPlus逆向工程入门指南:让你的开发更高效、更简洁、更优雅

学会了&#xff0c;可以看看这篇文章&#xff1a;更新中~ 正向工程&#xff1a;先创建Java实体类&#xff0c;由框架负责根据实体类生成数据库表。Hibernate是支持正向工程的。 逆向工程&#xff1a;先创建数据库表&#xff0c;由框架负责根据数据库表&#xff0c;反向生成如下…...

通用商城项目(下)

记录一些踩坑的地方&#xff0c;以及理顺一些思路。 通过管理系统页面&#xff0c;完成商品属性分组和商品属性&#xff08;基本属性&#xff09;关联维护 属性表 与 属性组表 的功能完善&#xff1a;显示属性组与属性表的一对多关系 前端 1. 引入组件&#xff0c;是否显示使…...

k8s集群使用ingress转发grafana服务

文章目录 前言一、思路二、grafana准备1. grafana-configmap.yaml2. grafana.yaml 三、ingress准备1. ingress.yaml2. grafana-externalname.yaml3. ingress-nginx-controller 四、 本机host文件准备五、访问测试 前言 在k8s集群中&#xff0c;使用ingress服务转发grafana的页…...

MongoDB的备份和恢复

工具 mongodump 和 mongorestore是MongoDB自带的备份恢复工具。 参考文章 ## https://blog.csdn.net/GUDUzhongliang/article/details/131915625## https://blog.csdn.net/mingongge/article/details/130695422 备份 mongodump 参数 -h, --host<hostname> …...

Pytorch学习笔记(GPU训练)

GUP训练 配置pytorch的gup版本主要是在网络模型、输入和标记的数据、损失函数 方式一 直接.cuda()调用&#xff0c;在原有的模型训练代码中的网络模型、输入和标记的数据、损失函数部分直接调用即可 方式二 事先定义好设备device,然后直接.to(device)调用&#xff0c;在原…...

一款开源的shell脚本分析工具

大家好&#xff0c;今天分享一款开源工具--shellcheck。 shellcheck 简介 今天发现的一款神器&#xff0c;如果你日常会接触到shell脚本&#xff0c;或者说自己需要写一些shell脚本&#xff0c;那么强烈建议你用下这个工具。 shellcheck一个静态的shell脚本分析工具&#xf…...

HTML <video> 标签

实例 一段简单的 HTML5 视频: <video src="movie.ogg" controls="controls"> 您的浏览器不支持 video 标签。 </video>定义和用法 <video> 标签定义视频,比如电影片段或其他视频流。 浏览器支持 元素ChromeIEFirefoxSafariOpera&l…...

mac 本地运行 http-proxy-middleware ,请求超时

const http require(http)"/customer": {target: "http://10.10.111.192:8080/",// target: "http://user.jinfu.baohan.com/",changeOrigin: true, // 是否启用跨域// 解决mac 代理超时问题headers: {Connection: "keep-alive"},// …...

【Effective Python】读书笔记-05类与接口

1. 让组合起来的类来实现多层结构&#xff0c;不用使用嵌套的内置类型 2. 让简单的接口接收函数&#xff0c;而不是类的实例 from collections import defaultdictcurrent {a: 1,b: 2,c: 3, }add_to_current {f: 4,e: 5, }def increment():count 0def missing():nonlocal …...

【办公自动化】用Python在Excel中查找并替换数据(文末送书)

&#x1f935;‍♂️ 个人主页&#xff1a;艾派森的个人主页 ✍&#x1f3fb;作者简介&#xff1a;Python学习者 &#x1f40b; 希望大家多多支持&#xff0c;我们一起进步&#xff01;&#x1f604; 如果文章对你有帮助的话&#xff0c; 欢迎评论 &#x1f4ac;点赞&#x1f4…...

python学习随笔3

range的使用 range()在python很常用&#xff0c;可以进行初始化和遍历等。 # range(st,ed) # [st, ed)# range(st,ed,step) # range(st, ed, step) i,i step, i 2 * step ... () < ed切片 跟range类似。 ll[st:ed:step]容器 元组 python中的元组中内容不可以进行更…...

《TCP/IP网络编程》阅读笔记--epoll的使用

1--epoll的优点 select()的缺点&#xff1a; ① 调用 select() 函数后针对所有文件描述符的循环语句&#xff1b; ② 调用 select() 函数时需要向操作系统传递监视对象信息&#xff1b; epoll()的优点&#xff1a; ① 无需编写以监视状态变化为目的的针对所有文件描述符的循环语…...

Python 递归函数

视频版教程 Python3零基础7天入门实战视频教程 在一个函数体内调用它自身&#xff0c;被称为函数递归。函数递归包含了一种隐式的循环&#xff0c;它会重复执行某段代码&#xff0c;但这种重复执行无须循环控制。 实例&#xff0c;求123…100的和&#xff0c;用递归实现。数学…...

Java实现计算两个日期之间的工作日天数

需求&#xff1a; 需要在后端实现 计算当前日期与数据库内保存的日期数据之间相隔的工作日数目 实现 import java.time.DayOfWeek; import java.time.LocalDateTime;public class WorkdaysCalculator {public static void main(String[] args) {String givenDateTimeStr &q…...

CS5817规格书|CS5817芯片参数|多功能便携式显示器方案芯片规格

CS5817支持最高4K 60Hz是集睿致远&#xff08;ASL&#xff09; 新推出的多功能显示控制器芯片&#xff0c;CS5817产品可应用于便携显示器、电竞显示器、桌面显示器、一体式台式机和嵌入式显示系统。 Type-C/DP/HDMI2.0输入转LVDS/eDP/VBO 芯片, 高度集成了多种输入输出接口, 并…...

2023面试知识点一

1、新生代和老年代的比例 默认的&#xff0c;新生代 ( Young ) 与老年代 ( Old ) 的比例的值为 1:2 ( 该值可以通过参数 –XX:NewRatio 来指定 )&#xff0c;即&#xff1a;新生代 ( Young ) 1/3 的堆空间大小。老年代 ( Old ) 2/3 的堆空间大小。其中&#xff0c;新生代 ( …...

【算法题】2856. 删除数对后的最小数组长度

题目&#xff1a; 给你一个下标从 0 开始的 非递减 整数数组 nums 。 你可以执行以下操作任意次&#xff1a; 选择 两个 下标 i 和 j &#xff0c;满足 i < j 且 nums[i] < nums[j] 。 将 nums 中下标在 i 和 j 处的元素删除。剩余元素按照原来的顺序组成新的数组&…...

Java面向对象编程

在关系型是数据库中&#xff0c;有两个不同的事务同时操作数据库中同一表的同一行&#xff0c;不会引起冲突的是&#xff1a; A. 其中一个DELETE操作&#xff0c;一个是SELECT操作 B. 其中两个都是UPDATE C. 其中一个是SELECT&#xff0c;一个是UPDATE D. 其中一个SELECT E. 其…...

K8S:Yaml文件详解及编写示例

文章目录 一.Yaml文件详解1.Yaml文件格式2.YAML 语法格式 二.Yaml文件编写及相关概念1.查看 api 资源版本标签2.yaml编写案例&#xff08;1&#xff09;相关标签介绍&#xff08;2&#xff09;Deployment类型编写nginx服务&#xff08;3&#xff09;k8s集群中的port介绍&#x…...

去耦电路设计应用指南(一)MCU去耦设计介绍

&#xff08;一&#xff09;MCU去耦设计介绍 1. 概述2. MCU需要去耦的原因2.1 去耦电路简介2.2 电源噪声产生的原因2.3 插入损耗2.4 去耦电路简介 参考资料来自网上&#xff1a; 1. 概述 我们经常看到单片机或者IC电路管脚常常会放置一个或者多个陶瓷电容&#xff0c;他们主要…...

【c++】杂记

文章目录 预处理器constauto 预处理器 预处理器&#xff1a;运行于编译过程之前的一段程序 预处理变量&#xff1a;不属于命名空间std,由预处理器负责管理 const const对象一旦创建就不再改变 const对象必须初始化 const对象旨在文件内有效 ectern const int bufsizefun() /…...

简记:使用 Django Shell 清空 数据库表

简记 使用 Django Shell 清空所有数据库表 jcLee95的博客&#xff1a;https://blog.csdn.net/qq_28550263 本文地址&#xff1a;https://blog.csdn.net/qq_28550263/article/details/132862795 目 录 1. 描述2. 步骤备份重要数据进入 Django Shell输入脚本 1. 描述 由于历史的…...

Web项目测试

http: //localhost: 8080 /shop1/ 协议 服务器的地址 端口号 相应的代码文件或文件夹 127.0.0.1 (服务器所在的端口) Web项目测试:系统测试 Web项目测试要做什么类型:接口测试、功能测试、性能测试、兼容性测试、安全测试、界面测试、易…...

Springboot 集成 Ehcache 提示 Cannot find cache named ‘employee_all‘ for Builder

异常提示&#xff1a; java.lang.IllegalArgumentException: Cannot find cache named employee_all for Builder[public java.lang.Iterable org.bc.device.service.EmployeeService.findAll()] caches[employee_all] | key | keyGeneratorkeyGenerator | cacheManager | cac…...

pandas 笔记:shift

用于将数据系列或数据框中的数据按指定的位置移动。这对于某些时间序列分析特别有用&#xff0c;例如计算数据的变化量或滞后值 1 对Series/DataFrame数据进行移动 1.0 原始数据 import pandas as pd import numpy as np df1pd.DataFrame(np.arange(12).reshape(3,4),column…...

解密(2023寒假每日一题 20)

给定一个正整数 k k k &#xff0c;有 k k k 次询问&#xff0c;每次给定三个正整数 n i , e i , d i n_i,e_i,d_i ni​,ei​,di​ &#xff0c;求两个正整数 p i , q i p_i,q_i pi​,qi​ &#xff0c;使 n i p i q i &#xff0c; e i d i ( p i − 1 ) ( q i − 1 …...

如何实现Web应用、网站状态的监控?

如何实现Web应用、网站状态的监控&#xff1f; 关键词&#xff1a;网站监控,服务器监控,页面性能监控,用户体验监控本文通过代码分析、网站应用介绍网站状态监控的方式下文主要分为网站应用、技术实现两部分 一、网站应用 现在网络上已经存在一些Web网站监控的服务&#xff…...

清河做网站哪家好/宁波seo免费优化软件

目录 作用安装全局配置配置进程池参考Company开发环境转发请求给PHP-FPM思考作用 PHP-FPM(PHP FastCGI Process Manager)意&#xff1a;PHP FastCGI 进程管理器&#xff0c;用于管理PHP 进程池的软件&#xff0c;用于接受web服务器的请求。 PHP-FPM提供了更好的PHP进程管理方式…...

门户网站模板 免费/专业seo网站优化推广排名教程

好程序员web前端教程分享JavaScript验证API&#xff0c;小编每天会分享一下干货给大家。那么今天说道的就是web前端培训课程中的章节。JavaScript验证API约束验证DOM方法PropertyDescriptioncheckValidity()如果 input 元素中的数据是合法的返回 true&#xff0c;否则返回 fals…...

网站建设与管理专业找暑假工/邯郸seo排名

两个虚拟机产品Sun VirtualBox 和 VMware Workstation&#xff0c;两家公司Sun Microsystems, Inc.&#xff08;被Oracle收购&#xff09;和VMware, Inc.&#xff0c;两种模式开源和商业。 由于新买了电脑&#xff0c;cpu支持vt-x&#xff08;intel的硬件支持虚拟化加速&#x…...

如何快速自己做网站/网络销售怎么聊客户

转载至&#xff1a;http://blog.csdn.net/denglxsc/article/details/51188444 在开发过程中对程序方法、类的描述不仅方便阅读、更能体现一个良好的编码习惯&#xff0c;但是自带的文档注释快捷键以及自动生成的注释总是不够完美&#xff0c;既然不完美&#xff0c;那么我们就…...

久久营销网站/北京网站seo

English中文含义Terrain地形&#xff0c;Spur山嘴&#xff1b;尖坡Depression洼地Valley峡谷Saddle鞍部Hill小山Draw山坳Cliff悬崖Ridge山脊Protractor量角器contour line等高线legend图例azimuth方位角relief地形MGRS (Military Grid Reference System)军事格网坐标universal …...

做视频解析网站违法不/优化大师 win10下载

示例1&#xff1a; 输入 5 1000000007 2 3 4 5 107输出 2 24 264 3240 736935633题意&#xff1a; 一个森林的代价为内部每个节点度数的平方和。问所有带标号的n 个点的森林的代价和 。 代码&#xff1a; #include <bits/stdc.h> using namespace std; const int N 5…...