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

数据结构初阶排序全解

目录

1>>排序前言

2>>插入排序

2.1>>直接插入排序

2.2>>希尔排序

3>>选择排序

3.1>>直接选择排序

3.2>>堆排序

4>>交换排序

4.1冒泡排序

4.2快速排序

5>>归并排序

6>>测试

test.c

sort.h

sort.c

7>>总结


1>>排序前言

        排序顾名思义,就是将一组乱序的数,按从大到小或者从小到大进行排列的操作。

常见的排序如下

可以看到排序也是有分类的,既然有分类,那么这边给出宝子们一个思考,在最后测试的时候给出答案,思考1:排序方法这么多,哪个最好呢?最差的有什么用呢?

那么废话不多说,今天的重点内容就是理解并写出一个个排序算法,现在直接上高速,带着宝子们攻破一个个排序算法

这边给出各个排序算法的声明,会在对应内容进行解释,宝子们先有个印象即可~~

2>>插入排序

2.1>>直接插入排序

        直插排序类似生活中的扑克牌,每拿到一张新牌,就要插入到手中的有序扑克牌中。那靠这个思路就可以写出步骤:

1.设置新插入的牌tmp

2.比较之前的每一个牌,找到比tmp小的,将整体往后移动腾出空间

3.插入到这张牌后面

代码如下:

设置end为每次手中牌的末尾,tmp为新插入的牌,循环end>=0进入循环,如果比较发现手中牌比插入牌大,那么将手中牌往后移动一位,若小,跳出循环,将这张牌后一张牌,也就是空出来的位置赋值tmp,也就是新插入的牌。

2.2>>希尔排序

        希尔排序相当于直接插入排序的最优化法,什么意思呢?就是通过预排序,将整个数组提升到接近有序的状态,最后再用直插排序进行排序,这样会快很多,那怎么实现呢?就是通过分组,将每隔n/3+1个数两两分为一组,先实现一次预备排序,这里直接来看代码进行解释

 刚开始令gap等于n,只要gap大于1那么就进入循环,每次gap等于gap/3+1,每次都进行预排序,当gap为1时就是直接插入排序啦,代码也只需要更改直接插入排序里面为1的值即可。

3>>选择排序

3.1>>直接选择排序

思路:

1.定义begin和end代表开始与结束,每次循环begin++,end--直到begin>=end

2.找出数组内最大值和最小值

3.将最大值和end交换,最小值与begin交换

代码如下:

代码就是定义begin为0,end为末尾值,然后循环遍历找最大值下标和最小值下标,在出循环的时候进行交换即可。

注意:当begin等于max的时候,此时交换相当于原地不动,因此需要让max等于min让它实现原地交换一次,在跟end互换。如 9  3  5   1begin为9,max也为9,end为1,min也为1,实现上面交换,1 3 5 9,max又跟end交换,9 3 5 1,所以需要避免这种情况。

3.2>>堆排序

1.要实现堆排序,首先得要是一个堆,那么第一个循环就要把堆建立,双亲结点向下调整思想,从最后一个结点的双亲结点开始(最后一个结点是n-1)它的双亲结点是-1然后除2,依次向下调整,这样就是一个堆。

2.将这个棵树的每一个子树都想象成一个堆,然后:

3.从最后一个结点开始,到0为止,每次交换它的最后一个结点和第0个结点,然后向下调整,这样就能够从大/从小排序

4>>交换排序

4.1冒泡排序

需要十个数就用数组存储,那么两两相邻的相比不就是数组两个相邻元素的比较吗?所以使用j和j+1进行比较,这里要注意j要<9,因为这样操作的就是0-8下标的值,j+1就不会越界,并且每次循环都将一个最大的放到最右边了,所以j<9-i每次循环少循环一次

到这里,基本框架已经完成,我们只需再完善一下:如果我们输入的十个数是9 0 1 2 3 4 5 6 7 8,那么会发现,即使我们第一次循环就已经排序完成,但是循环还是进行了,那么此时我们就可以加入一个布尔值变量,在循环开始定义为1,如果对数值进行两两替换,那么布尔值就为0,若出来为1就跳出循环即可,这种操作广泛用于各种循环和一些满足条件跳出的代码,可以充分减少运行次数。

4.2快速排序

快速排序讲一种最经典的排序找基准值法——hoare法

 如何实现快速排序呢?就要通过递归的思想实现,每次找到一个基准值,使得左边的数都小于它,右边的数都大于它。

那么hoare方法就是设定基准值为0下标值,定义left和right,从右边往左找比基准值小的,从左往右找比基准值小的,然后进行交换,最后当left>right时,交换基准值和right,返回right就是基准值啦!

5>>归并排序

这个比较复杂,但是也还好,容我细说

以上素材来源网络,如有侵权告知删除。

借用一下,通过这张图片来理解,所谓归并,就是一个数组微分积分的过程,将一个无序数组,不断的拆解,拆成单个单个有序数组,实现两个有序数组的排序,这就是归并。

那么代码怎么实现呢?

首先,这是一个递归的过程,每次都进行二分,分成左右序列,0-3为新无序数列,4-7为新无序数列,分到它为有序为止,也就是

单个的时候,本身就是一个有序的比较10,6,谁小谁先放,然后依次放入新数组,此时需要一个新数组暂时存排序后的值,然后赋值给原数组。来看代码吧

void _MergeSort(int* arr,int left, int right,int* tmp) {if (left >= right)return;	int mid = left + (right - left) / 2;//分成左右序列_MergeSort(arr, left, mid, tmp);_MergeSort(arr, mid+1, right, tmp);//定义两个假有序数组int begin1 = left;int end1 = mid;int begin2 = mid + 1;int end2 = right;int index = begin1;//index表示第二个暂存数组的下标值while (begin1 <= end1 && begin2 <= end2) {if (arr[begin1] > arr[begin2]) {tmp[index++] = arr[begin2++];}else{tmp[index++] = arr[begin1++];}}while (begin1 <= end1) {tmp[index++] = arr[begin1++];}while (begin2 <= end2) {tmp[index++] = arr[begin2++];}//最后把暂存数组值放到原数组for (int i = left; i <= right; i++) {arr[i] = tmp[i];}
}
void MergeSort(int* arr, int n) {int* tmp = (int*)malloc(sizeof(int) * n);_MergeSort(arr, 0, n - 1, tmp);free(tmp);
}

希望我的讲解能帮助大家理解归并排序。

6>>测试

接下来测试每个排序的时间复杂度

这里能看到快排和归并是最快的,还有堆排序,这边没有导入它的代码,下来可以自己尝试噢,希尔其次,冒泡排序最次,那解决前面的疑问,为什么还要冒泡排序呢?因为它有教学意义,较为简单,更好理解。

test.c

#include"sort.h"
#include<stdio.h>
#include<time.h>
#include<stdlib.h>
void PrintArr(int* arr, int n)
{for (int i = 0; i < n; i++){printf("%d ", arr[i]);}printf("\n");
}void test() {int a[] = { 5, 3, 9, 6, 2, 4, 7, 1, 8 };int n = sizeof(a) / sizeof(a[0]);printf("排序之前:");PrintArr(a, n);MergeSort(a, n);//quicksort(a, 0, n - 1);printf("排序之后:");PrintArr(a, n);
}                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  void TestOP()
{srand(time(0));const int N = 100000;int* a1 = (int*)malloc(sizeof(int) * N);int* a2 = (int*)malloc(sizeof(int) * N);int* a3 = (int*)malloc(sizeof(int) * N);//int* a4 = (int*)malloc(sizeof(int) * N);int* a5 = (int*)malloc(sizeof(int) * N);int* a6 = (int*)malloc(sizeof(int) * N);//int* a7 = (int*)malloc(sizeof(int) * N);for (int i = 0; i < N; ++i){a1[i] = rand();a2[i] = a1[i];a3[i] = a1[i];//a4[i] = a1[i];a5[i] = a1[i];a6[i] = a1[i];//a7[i] = a1[i];}int begin1 = clock();insertsort(a1, N);int end1 = clock();int begin2 = clock();shellsort(a2, N);int end2 = clock();int begin3 = clock();selectsort(a3, N);int end3 = clock();//int begin4 = clock();//HeapSort(a4, N);//int end4 = clock();int begin5 = clock();quicksort(a5, 0, N - 1);int end5 = clock();int begin6 = clock();MergeSort(a6, N);int end6 = clock();//int begin7 = clock();//BubbleSort(a7, N);//int end7 = clock();printf("InsertSort:%d\n", end1 - begin1);printf("ShellSort:%d\n", end2 - begin2);printf("SelectSort:%d\n", end3 - begin3);//printf("HeapSort:%d\n", end4 - begin4);printf("QuickSort:%d\n", end5 - begin5);printf("MergeSort:%d\n", end6 - begin6);//printf("BubbleSort:%d\n", end7 - begin7);//free(a1);//free(a2);//free(a3);//free(a4);//free(a5);//free(a6);//free(a7);
}int main()
{//test();TestOP();return 0;
}

sort.h

#pragma once
#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>
#include<assert.h>
#include<string.h>
#include"stack.h"
void insertsort(int* arr, int n);//直插排序
void shellsort(int* arr, int n);//希尔排序void selectsort(int* arr, int n);//选择排序
void HeapSort(int* arr, int n);//堆排序void BubbleSort(int* arr, int n);//冒泡排序
void quicksort(int* arr, int left, int right);//快排
void QuickSortNonR(int* arr, int left, int right);//非递归借栈快排void MergeSort(int* arr, int n);//归并排序

sort.c

#include"sort.h"
#include"stack.h"void insertsort(int* arr, int n) {for (int i = 0; i < n - 1; i++) {int end = i;int tmp = arr[end + 1];while (end >= 0) {if (arr[end] > tmp) {arr[end + 1] = arr[end];end--;}else {break;}}arr[end + 1] = tmp;}
}void shellsort(int* arr, int n) {int gap = n;while (gap > 1) {gap = gap / 3 + 1;for (int i = 0; i < n - gap; i++) {int end = i;int tmp = arr[end + gap];while (end >= 0) {if (arr[end] > tmp) {arr[end + gap] = arr[end];end-=gap;}else {break;}}arr[end + gap] = tmp;}}
}
void swap(int* x, int* y) {int tmp = *x;*x = *y;*y = tmp;
}
void selectsort(int* arr, int n) {int end = n - 1;int begin = 0;while(begin<end){int min = begin;int max = begin;for (int i = begin + 1; i <=end; i++) {if (arr[i] < arr[min])min = i;if (arr[i] > arr[max])max = i;}if (begin == max)max = min;swap(&arr[min], &arr[begin]);swap(&arr[max], &arr[end]);begin++;end--;}
}// 你这个是什么方法hoare找基准值
int _quicksort(int* arr, int left, int right) {int keyi = left;left++;while (left <= right) {while (left <= right && arr[right] > arr[keyi])right--;while (left <= right && arr[left] < arr[keyi])left++;if (left<=right)swap(&arr[left++], &arr[right--]);}swap(&arr[right], &arr[keyi]);return right;
}
int _quicksort1(int* arr, int left, int right) {//挖洞法//hole等于初始值,right从右从右往左找小,left找大int hole = left;int key = arr[hole];while (left < right) {while (left<right && arr[right]>key) {right--;}arr[hole] = arr[right];hole = right;while (left<right && arr[left]<key) {left++;}arr[hole] = arr[left];hole = left;}arr[hole] = key;return hole;
}int _quicksort2(int* arr, int left, int right) {//前后指针int prev = left;int key = left;int pcur = left + 1;while (pcur <= right) {if (arr[pcur] < arr[key]&& ++prev != pcur) {swap(&arr[pcur], &arr[prev]);}pcur++;}swap(&arr[prev], &arr[key]);return prev;
}
void quicksort(int* arr, int left, int right) {//找基准值//right从右往左找比基准值小,left从左往右找比基准值大,找到实现交换,// left>right交换right和基准值if (left >= right)return;int keyi = _quicksort(arr,left,right);quicksort(arr, left, keyi-1);quicksort(arr, keyi+1, right);
}void QuickSortNonR(int* arr, int left, int right) {stack st;stinit(&st);stenter(&st, right);stenter(&st, left);while (!stackempty(&st)) {int begin = stackTop(&st);stackpop(&st);int end = stackTop(&st);stackpop(&st);//双指针找基准值划分左右序列int prev = begin;int key = begin;int pcur = begin + 1;while (pcur <= end) {if (arr[pcur] < arr[key] && ++prev != pcur) {swap(&arr[pcur], &arr[prev]);}pcur++;}swap(&arr[prev], &arr[key]);key = prev;//基准值下标为key//划分左序列(左子树)[begin,key-]和右序列[key+1,end]if (key + 1 < end) {stenter(&st, end);stenter(&st, key+1);}if (key - 1 > begin) {stenter(&st, key-1);stenter(&st,begin);}}struin(&st);
}
void _MergeSort(int* arr,int left, int right,int* tmp) {if (left >= right)return;	int mid = left + (right - left) / 2;//分成左右序列_MergeSort(arr, left, mid, tmp);_MergeSort(arr, mid+1, right, tmp);//定义两个假有序数组int begin1 = left;int end1 = mid;int begin2 = mid + 1;int end2 = right;int index = begin1;//index表示第二个暂存数组的下标值while (begin1 <= end1 && begin2 <= end2) {if (arr[begin1] > arr[begin2]) {tmp[index++] = arr[begin2++];}else{tmp[index++] = arr[begin1++];}}while (begin1 <= end1) {tmp[index++] = arr[begin1++];}while (begin2 <= end2) {tmp[index++] = arr[begin2++];}//最后把暂存数组值放到原数组for (int i = left; i <= right; i++) {arr[i] = tmp[i];}
}
void MergeSort(int* arr, int n) {int* tmp = (int*)malloc(sizeof(int) * n);_MergeSort(arr, 0, n - 1, tmp);free(tmp);
}

7>>总结

        今天讲解了各种类型的排序算法,最常用的还是时间复杂度最小的堆排序、快排、归并排序,希望这篇文章对大家有用,如果有问题欢迎评论区一起探讨,谢谢宝子们的观看,期待与你下篇再见~~

相关文章:

数据结构初阶排序全解

目录 1>>排序前言 2>>插入排序 2.1>>直接插入排序 2.2>>希尔排序 3>>选择排序 3.1>>直接选择排序 3.2>>堆排序 4>>交换排序 4.1冒泡排序 4.2快速排序 5>>归并排序 6>>测试 test.c sort.h sort.c 7…...

MySQL的SQL语句之触发器的创建和应用

触发器 Trigger 一.触发器 作用&#xff1a;当检测到某种数据表发生数据变化时&#xff0c;自动执行操作&#xff0c;保证数据的完整性&#xff0c;保证数据的一致性。 1.创建一个触发器 如上图所示&#xff0c;查看这个create的帮助信息的时候&#xff0c;这个create trig…...

myWebserver 介绍

项目总结 项目准备过程中&#xff0c;主要阅读了《Linux 高性能服务器编程》游双 一书。源码参考的是&#xff1a;TinyWebServer&#xff0c;我在此源码的基础上做了一定的优化和修改。 我的代码&#xff1a;Github: myWebserver: 我的C服务器项目 我的 Webserver 项目总结&…...

钉钉平台开发小程序

一、下载小程序开发者工具 官网地址&#xff1a;小程序开发工具 - 钉钉开放平台 客户端类型 下载链接 MacOS x64 https://ur.alipay.com/volans-demo_MiniProgramStudio-x64.dmg MacOS arm64 https://ur.alipay.com/volans-demo_MiniProgramStudio-arm64.dmg Windows ht…...

九识智能与徐工汽车达成战略合作,共绘商用车未来新蓝图

近日&#xff0c;九识智能与徐工汽车签署战略合作协议&#xff0c;标志着双方在智能驾驶技术与新能源商用车融合应用、联合生产及市场推广等方面迈入深度合作的新篇章&#xff0c;将共同引领智能驾驶技术商业化浪潮。 近年来&#xff0c;在国家智能化发展战略的引领下&#xff…...

Serverless + AI 让应用开发更简单

本文整理自 2024 云栖大会&#xff0c;阿里云智能高级技术专家&#xff0c;史明伟演讲议题《Serverless AI 让应用开发更简单》 随着云计算和人工智能&#xff08;AI&#xff09;技术的飞速发展&#xff0c;企业对于高效、灵活且成本效益高的解决方案的需求日益增长。本文旨在…...

外包功能测试就干了4周,技术退步太明显了。。。。。

先说一下自己的情况&#xff0c;大专生&#xff0c;21年通过校招进入武汉某软件公司&#xff0c;干了差不多3个星期的功能测试&#xff0c;那年国庆&#xff0c;感觉自己不能够在这样下去了&#xff0c;长时间呆在一个舒适的环境会让一个人堕落!而我才在一个外包企业干了4周的功…...

外观模式及运用场景

外观模式&#xff08;Facade Pattern&#xff09;是一种结构性设计模式&#xff0c;它为复杂子系统提供一个统一的接口&#xff0c;从而简化与这些子系统的交互。通过外观模式&#xff0c;客户端可以更轻松地使用复杂系统&#xff0c;而不必了解其内部实现。接下来&#xff0c;…...

PyQt5实战——多脚本集合包,UI以及工程布局(二)

个人博客&#xff1a;苏三有春的博客 系列往期&#xff1a; PyQt5实战——多脚本集合包&#xff0c;前言与环境配置&#xff08;一&#xff09; 布局 2.1 UI页面布局 整体框架分为分为三个部分&#xff0c;垂直分布。 第一个部分为功能选择按钮&#xff08;如UTF-8转换&#…...

Python 数据结构对比:列表与数组的选择指南

文章目录 &#x1f4af;前言&#x1f4af;Python中的列表&#xff08;list&#xff09;和数组&#xff08;array&#xff09;的详细对比1. 数据类型的灵活性2. 性能与效率3. 功能与操作4. 使用场景5. 数据结构选择的考量6. 实际应用案例7. 结论 &#x1f4af;小结 &#x1f4af…...

gem5运行简单RISC-V全系统模拟

简单记录gem5中运行最简单的RISC-V Full System Simulation的过程 首先是编译RISC-V和m5term&#xff0c;这部分不多写了&#xff0c;官网均有对应教程。 之后直接使用官方在configs/example/gem5_library目录下的riscv-fs.py 运行如下命令 ./build/RISCV/gem5.opt configs/…...

洛谷 P1195 口袋的天空

自用。 题目传送门&#xff1a;口袋的天空 - 洛谷 题解&#xff1a;Inori_333 参考题解&#xff1a;题解 P1195 【口袋的天空】 - 洛谷专栏 /*P1195 口袋的天空https://www.luogu.com.cn/problem/P11952024/11/03 submit:inori333 */#include <iostream> #include &…...

ffmpeg视频滤镜:膨胀操作-dilation

滤镜介绍 dilation 官网链接 > FFmpeg Filters Documentation 膨胀滤镜会使图片变的更亮&#xff0c;会让细节别的更明显。膨胀也是形态学中的一种操作&#xff0c;在opencv中也有响应的算子。此外膨胀结合此前腐蚀操作&#xff0c;可以构成开闭操作。 开操作是先腐蚀…...

3.3 windows,ReactOS系统中页面的换出----2,结构体PHYSICAL_PAGE

系列文章目录 提示&#xff1a;这里可以添加系列文章的所有文章的目录&#xff0c;目录需要自己手动添加 例如&#xff1a;第一章 Python 机器学习入门之pandas的使用 提示&#xff1a;写完文章后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目…...

lvgl

lvgl 目录 lvgl Lvgl移植到STM32 -- 1、下载LVGL源码 -- 2、将必要文件复制到工程目录 -- 3、修改配置文件 将lvgl与底层屏幕结合到一块 -- lvgl也需要有定时器,专门给自己做了一个函数,告诉lvgl经过了多长时间(ms(毫秒)级别) 编写代码 lvgl的中文教程手册网站…...

【django】RESTful API 设计指南

目录 一、协议 二、域名 三、版本&#xff08;Versioning&#xff09; 四、路径&#xff08;Endpoint&#xff09; 五、HTTP动词 5.1 CRUD操作&#xff1a; 5.2 其他动词&#xff1a; 六、过滤信息&#xff08;Filtering&#xff09; 七、状态码&#xff08;Status Co…...

提升大数据量分页查询性能:深分页优化全解

前言 在处理数据量逐渐增大的数据库表时&#xff0c;优化查询性能是一个常见的挑战。朋友们可能会建议说&#xff0c;创建索引不就能解决问题了吗&#xff1f;然而&#xff0c;当数据量达到相当规模时&#xff0c;简单的索引可能不足以应对所有情况。这时&#xff0c;可能会有…...

WPF 实现冒泡排序可视化

WPF 实现冒泡排序可视化 实现冒泡排序代码就不过多讲解&#xff0c;主要是实现动画效果思路&#xff0c;本demo使用MVVM模式编写&#xff0c;读者可自行参考部分核心代码&#xff0c;即可实现如视频所示效果。 对于新手了解算法相关知识应该有些许帮助&#xff0c;至于其它类型…...

Claude 3.5 新功能 支持对 100 页的PDF 图像、图表和图形进行可视化分析

Claude 3.5 Sonnet发布PDF图像预览新功能&#xff0c;允许用户分析长度不超过100页的PDF中的视觉内容。 此功能使用户能够轻松上传文档并提取信息&#xff0c;特别适用于包含图表、图形和其他视觉元素的研究论文和技术文档。 视觉PDF分析&#xff1a;用户现在可以从包含各种视觉…...

正式开源:从 Greenplum 到 Cloudberry 迁移工具 cbcopy 发布

Cloudberry Database 作为 Greenplum 衍生版本和首选开源替代&#xff0c;由 Greenplum 原始团队成员创建&#xff0c;与 Greenplum 保持原生兼容&#xff0c;并能实现无缝迁移&#xff0c;且具备更新的 PostgreSQL 内核和更丰富的功能。GitHub: https://github.com/cloudberry…...

Python如何读写文件?

1. 文件读取 &#xff08;1&#xff09;使用open()函数打开文件 基本语法是file_object open(file_name, mode)&#xff0c;其中file_name是要打开的文件的名称&#xff08;包括路径&#xff0c;如果文件不在当前目录下&#xff09;&#xff0c;mode是打开文件的模式。例如&a…...

100种算法【Python版】第38篇——Boyer-Moore算法

本文目录 1 算法说明2 算法示例3 python代码1 算法说明 Boyer-Moore算法由Robert S. Boyer和J. Strother Moore于1977年提出,旨在提高字符串匹配的效率。该算法在寻找固定模式的过程中,利用模式本身的信息,优化搜索过程,特别适合长文本中的模式查找。 算法原理 Boyer-Moo…...

贪心算法---java---黑马

贪心算法 1)Greedy algorithm 称之为贪心算法或者贪婪算法&#xff0c;核心思想是 将寻找最优解的问题分为若干个步骤每一步骤都采用贪心原则&#xff0c;选取当前最优解因为未考虑所有可能&#xff0c;局部最优的堆叠不一定得到最终解最优 贪心算法例子 Dijkstra while …...

程序员的减压秘籍:高效与健康的平衡艺术

引言 在当今竞争激烈的科技行业中&#xff0c;程序员常常面临着极高的精神集中要求和持续的创新压力。这种工作性质让许多程序员在追求高效和创新的过程中&#xff0c;感到精疲力竭&#xff0c;面临身心健康的挑战。因此&#xff0c;找到有效的方法来缓解工作压力&#xff0c;…...

2024 年 QEMU 峰会纪要

2024 年 QEMU 峰会已于 10 月 31 日在 KVM 论坛召开&#xff0c;这是一个仅对项目中最活跃的维护者和子维护者开放的邀请会议。 出席者&#xff1a; Dan Berrang Cdric Le Goater Kevin Wolf Michael S. Tsirkin Stefan Hajnoczi Philippe Mathieu-Daud Markus Armbruster Th…...

C++/list

目录 1.list的介绍 2.list的使用 2.1list的构造 2.2list iterator的使用 2.3list capacity 2.4list element access 2.5list modifers 2.6list的迭代器失效 3.list的模拟实现 4.list与vector的对比 欢迎 1.list的介绍 list的文档介绍 cplusplus.com/reference/list/li…...

刘艳兵-DBA015-对于属于默认undo撤销表空间的数据文件的丢失,哪条语句是正确的?

对于属于默认undo撤销表空间的数据文件的丢失&#xff0c;哪条语句是正确的&#xff1f; A 所有未提交的交易都将丢失。 B 数据库实例中止。 C 数据库处于MOUNT状态&#xff0c;需要恢复才能打开。 D 数据库保持打开状态以供查询&#xff0c;但除具有SYSDBA特权的用…...

树莓派基本设置--10.使用MIPI摄像头

树莓派5将以前的CSI和DSI接口合并成两个两用的CSI/DSI&#xff08;MIPI&#xff09;端口。 一、配置摄像头 使用树莓派摄像头或第三方相机可以按照下面表格修改相机配置&#xff1a; 摄像头模块文件位于&#xff1a;/boot/firmware/config.txtV1 相机 &#xff08;OV5647&am…...

【ARCGIS实验】地形特征线的提取

目录 一、提取不同位置的地形剖面线 二、将DEM转化为TIN 三、进行可视分析 四、进行山脊、山谷等特征线的提取 1、正负地形提取&#xff08;用于校正&#xff09; 2、山脊线提取 3、山谷线的提取 4、河网的提取 5、流域的分割 五、鞍部点的提取 1、背景 2、目的 3…...

HTML 基础标签——表格标签<table>

文章目录 1. `<table>` 标签:定义表格2. `<tr>` 标签:定义表格行3. `<th>` 标签:定义表头单元格4. `<td>` 标签:定义表格单元格5. `<caption>` 标签:为表格添加标题6. `<thead>` 标签:定义表格头部7. `<tbody>` 标签:定义表格…...