排序算法 -快速排序
文章目录
- 1. 快速排序(Quick Sort)
- 1.1、 简介
- 1.2、 快速排序的步骤
- 2. Hoare 版本
- 2.1、 基本思路
- 1. 分区(Partition)
- 2. 基准选择(Pivot Selection)
- 3. 递归排序(Recursive Sorting)
- 2.2 、代码实现
- 2.3、 代码解释
- 1. `GetMid` 函数:三数取中
- 作用:
- 逻辑:
- 2. `HoreQuickSort` 函数:Hoare 分区法的快速排序
- 主要步骤:
- 代码整体总结
- 2.4 、动画展示
- 3. 挖坑版
- 3.1、基本思路
- 3.2、挖坑法步骤
- 3.3、代码实现
- 3.4、动画展示
- 4. 前后指针
- 4.1、基本思路
- 4. 2、步骤
- 4.3 、代码中的实现:
- 解释:
- 4. 4 、动画展示
1. 快速排序(Quick Sort)
1.1、 简介
快速排序(Quick Sort)是一种高效的排序算法,通常用于大数据集的排序。它由英国计算机科学家 Tony Hoare 在 1960 年提出,并基于分治法(Divide and Conquer)的思想来排序数组或列表。
1.2、 快速排序的步骤
-
选择基准(Pivot):
- 从数组中选择一个元素作为基准。基准的选择方法会影响算法的性能,常用的基准选择策略包括:
- 选择第一个元素
- 选择最后一个元素
- 选择中间元素
- 随机选择
- 三数取中法(选择第一个、最后一个和中间位置的元素中位数作为基准)
- 从数组中选择一个元素作为基准。基准的选择方法会影响算法的性能,常用的基准选择策略包括:
-
划分(Partition):
- 将数组分为两部分,使得:
- 一部分的元素都小于等于基准;
- 另一部分的元素都大于基准。
- 此时,基准元素已经在排序后的正确位置上。
- 将数组分为两部分,使得:
-
递归排序:
- 对基准左侧的子数组和右侧的子数组递归地进行快速排序。
- 当子数组长度为 1 或 0 时,递归结束,此时该部分已经有序。
2. Hoare 版本
2.1、 基本思路
这个代码的基本思路是实现快速排序(QuickSort)算法的一个优化版本,主要包含 分区、递归 和 基准选择 三个关键步骤。以下是简化后的基本思路:
1. 分区(Partition)
快速排序的核心是“分区”操作。它通过选择一个基准值,将数组分成左右两部分,使得左侧的元素都小于等于基准,右侧的元素都大于等于基准。完成分区后,基准元素会处于它排序后的最终位置。
2. 基准选择(Pivot Selection)
在分区过程中,基准的选择直接影响算法的效率。理想情况下,基准会将数组分成大小相近的两部分,避免极端情况的出现。这里使用 三数取中法 来选择基准,即取数组左端、中间、右端的三个值中间的那个作为基准值。这样能够减少最坏情况的出现(例如数组本身有序时的情况),提高算法的平均性能。
3. 递归排序(Recursive Sorting)
完成分区后,基准两侧的子数组还未有序,需要对每个子数组继续进行快速排序。通过递归调用,将每个子数组逐步分成更小的部分,最终达到完全有序。递归的终止条件是数组长度为 1 或 0,这种情况直接返回,无需再排序。
2.2 、代码实现
#include <stdio.h>// 交换函数
void Swap(int *a, int *b) {int temp = *a;*a = *b;*b = temp;
}// 三数取中函数,返回左、中、右三者的中间值索引
int GetMid(int *a, int left, int right) {int mid = left + (right - left) / 2;if (a[left] > a[right]) {Swap(&a[left], &a[right]);}if (a[mid] > a[right]) {Swap(&a[mid], &a[right]);}if (a[left] < a[mid]) {Swap(&a[left], &a[mid]);}return left; // 返回基准元素的索引
}// Hoare 分区法的快速排序
void HoreQuickSort(int *a, int left, int right) {if (left >= right) {return;}int begin = left, end = right;int key = GetMid(a, left, right); // 三数取中并将基准值放到left位置Swap(&a[left], &a[key]); // 将基准交换到左端作为参考while (begin < end) {// 从右往左找到第一个小于基准的元素while (begin < end && a[end] >= a[left]) {--end;}// 从左往右找到第一个大于基准的元素while (begin < end && a[begin] <= a[left]) {++begin;}// 交换左右不符合顺序的元素if (begin < end) {Swap(&a[begin], &a[end]);}}// 最后将基准元素放到分区点Swap(&a[left], &a[begin]);// 递归排序左右两部分HoreQuickSort(a, left, begin - 1);HoreQuickSort(a, begin + 1, right);
}// 打印数组
void print_array(int *a, int size) {for (int i = 0; i < size; i++) {printf("%d ", a[i]);}printf("\n");
}// 主函数
int main() {int arr[] = {10, 7, 8, 9, 1, 5};int n = sizeof(arr) / sizeof(arr[0]);printf("原始数组: ");print_array(arr, n);HoreQuickSort(arr, 0, n - 1);printf("排序后数组: ");print_array(arr, n);return 0;
}
2.3、 代码解释
1. GetMid
函数:三数取中
int GetMid(int *a, int left, int right) {int mid = left + (right - left) / 2; // 计算中间索引if (a[left] > a[right]) {Swap(&a[left], &a[right]); // 保证a[left] <= a[right]}if (a[mid] > a[right]) {Swap(&a[mid], &a[right]); // 保证a[mid] <= a[right]}if (a[left] < a[mid]) {Swap(&a[left], &a[mid]); // 保证a[left] <= a[mid]}return left; // 返回左索引位置作为基准索引
}
作用:
GetMid
函数的目的是在 左端、中间、右端 三个元素中选出中间值作为基准,避免在近乎有序的数组中使用一个极值作为基准,从而减少分区的不平衡问题。
逻辑:
a[left] > a[right]
时交换,确保a[left]
比a[right]
小。a[mid] > a[right]
时交换,确保a[mid]
也比a[right]
小。a[left] < a[mid]
时交换,这样a[left]
成为了中间值。- 最后返回
left
,将三数取中的结果放到a[left]
,作为基准值。
2. HoreQuickSort
函数:Hoare 分区法的快速排序
void HoreQuickSort(int *a, int left, int right) {if (left >= right) {return; // 基本情况:如果只有一个元素或无元素,直接返回}int begin = left, end = right; // 初始化分区指针int key = GetMid(a, left, right); // 选择基准并取三数中值Swap(&a[left], &a[key]); // 将基准交换到左端while (begin < end) {// 从右向左找到第一个小于基准的元素while (begin < end && a[end] >= a[left]) {--end;}// 从左向右找到第一个大于基准的元素while (begin < end && a[begin] <= a[left]) {++begin;}// 交换找到的元素if (begin < end) {Swap(&a[begin], &a[end]);}}// 最后将基准元素放到最终位置Swap(&a[left], &a[begin]);// 递归排序左右两部分HoreQuickSort(a, left, begin - 1);HoreQuickSort(a, begin + 1, right);
}
主要步骤:
-
基准选择与初始化:
- 使用
GetMid
进行三数取中法选择基准,减少最坏情况下的不平衡。 - 将基准交换到
left
位置,方便分区操作。
- 使用
-
分区过程:
begin
和end
分别从左、右两端向中间移动。- 从右向左找到第一个小于基准的元素,将
end
移动到该位置。 - 从左向右找到第一个大于基准的元素,将
begin
移动到该位置。 - 如果
begin < end
,交换a[begin]
和a[end]
,确保小于基准的值在左侧,大于基准的值在右侧。 - 循环直到
begin >= end
,此时begin
指向的元素是分区的正确位置。
-
基准位置调整:
- 将
a[left]
(即基准值)和a[begin]
交换,使基准值放置在分区中间的正确位置。
- 将
-
递归调用:
- 对基准左侧(
left
到begin - 1
)和右侧(begin + 1
到right
)的子数组分别递归调用HoreQuickSort
进行排序,直到整个数组有序。
- 对基准左侧(
代码整体总结
- Hoare 分区法:通过双指针从两端向中间扫描,交换不符合条件的元素,提高分区效率。
- 三数取中法:选基准时用三数取中法,减少极端情况的出现。
- 递归快速排序:分区后对左右两部分递归排序,直到每个子数组有序。
2.4 、动画展示
3. 挖坑版
快速排序挖坑法是一种直观且高效的排序算法实现方式,它基于分治策略,通过递归地将数组分成较小的子数组来排序。以下是关于快速排序挖坑法的详细解释:
3.1、基本思路
快速排序的基本思想是选择一个基准值(pivot),然后将数组分成两部分:一部分包含所有小于基准值的元素,另一部分包含所有大于基准值的元素。接着,递归地对这两部分进行同样的操作,直到整个数组有序。
3.2、挖坑法步骤
-
选择基准值:
- 通常选择数组的第一个元素、最后一个元素或中间元素作为基准值。为了简单起见,这里以第一个元素为例。
- 记住基准值的位置,这个位置相当于一个“坑”。
-
初始化指针:
- 设置两个指针,left和right,分别指向数组的最左和最右两个元素。
-
从右向左遍历:
- 从right指针开始,将指针所指向的元素与基准值进行比较。
- 如果元素大于基准值,则right指针向左移动。
- 如果元素小于基准值,则将该元素填入坑中(即基准值原本的位置),并将该元素原本的位置视为新的坑。同时,left指针向右移动一位。
-
从左向右遍历:
- 从left指针开始,将指针所指向的元素与基准值进行比较(注意,此时基准值已被某个元素替换,因此实际上是与该元素进行比较)。
- 如果元素小于基准值(实际上是小于刚才被填入坑中的那个元素,因为基准值已被替换),则left指针向右移动。
- 如果元素大于基准值,则将该元素填入坑中,并将该元素原本的位置视为新的坑。同时,right指针向左移动一位。
-
重复步骤3和4:
- 继续按照上述步骤进行遍历,直到left和right指针重合。
-
放入基准值:
- 当left和right指针重合时,将基准值(或最初被选出的那个基准值的值,如果它在遍历过程中被替换了的话)放入重合的位置。
- 此时,基准值左边的所有元素都小于它,右边的所有元素都大于它。
-
递归排序:
- 对基准值左边和右边的子数组递归地进行上述操作,直到整个数组有序。
3.3、代码实现
// 挖坑法快速排序
void HoleQuickSort(int* arr, int left, int right)
{if (left >= right)return;// 使用第一个元素作为基准值(也可以选择其他方式,如三数取中)int pivotValue = arr[left];int holeIndex = left; // 挖坑的位置,初始化为基准值的位置int scanLeft = left, scanRight = right; // 左右扫描指针// 从右向左扫描,找到第一个小于基准值的元素while (scanRight > scanLeft){// 从右向左找到第一个小于基准值的元素while (scanRight > scanLeft && arr[scanRight] >= pivotValue)scanRight--;// 如果找到,将该元素放到坑里(holeIndex位置)if (scanRight > scanLeft){arr[holeIndex] = arr[scanRight];holeIndex = scanRight; // 更新坑的位置到当前元素的位置}// 从左向右扫描,找到第一个大于基准值的元素while (scanRight > scanLeft && arr[scanLeft] <= pivotValue)scanLeft++;// 如果找到,将该元素放到坑里(此时坑的位置可能已经被更新)if (scanRight > scanLeft){arr[holeIndex] = arr[scanLeft];holeIndex = scanLeft; // 再次更新坑的位置}}// 当左右扫描指针相遇时,将基准值放到坑里arr[holeIndex] = pivotValue;// 递归排序基准值左右两侧的子数组HoleQuickSort(arr, left, holeIndex - 1);HoleQuickSort(arr, holeIndex + 1, right);
}// 辅助函数:交换两个整数的值(此函数在您的原始代码中已提供,但为完整性而保留)
void swap(int* a, int* b)
{int temp = *a;*a = *b;*b = temp;
}
3.4、动画展示
4. 前后指针
4.1、基本思路
快速排序的前后指针法(也叫“双指针法”)是快速排序中的一种常见分区方法。这个方法通过两个指针,分别从数组的左右两端开始,来逐步划分数组,使得数组中的元素相对于一个基准元素(通常是数组的第一个元素)进行排序。
4. 2、步骤
-
选择基准元素:选择数组中的一个元素作为基准(pivot)。在你给出的代码中,基准是数组的第一个元素
key
。 -
设置两个指针:
- 前指针(pre):从左边开始,指向当前已经被正确分区的区域的末尾。初始时,
pre
指向基准元素。 - 后指针(cur):从左边的第二个元素开始,遍历整个数组,用来扫描比基准小的元素。
- 前指针(pre):从左边开始,指向当前已经被正确分区的区域的末尾。初始时,
-
扫描并交换:
- 前指针会不断向右移动,找到一个比基准小的元素。
- 后指针会遍历数组,直到找到一个比基准大的元素。
- 如果后指针找到一个大于基准的元素,同时前指针找到了一个小于基准的元素,则交换这两个元素。这保证了所有小于基准的元素都在基准的左边,所有大于基准的元素都在基准的右边。
-
完成分区:
- 当两个指针相遇时,或者后指针扫描到数组的右边界时,前后指针停止。
- 这时,将基准元素和
pre
指针所指向的元素交换。这样,基准元素就放置在了正确的位置上,左边是比基准小的元素,右边是比基准大的元素。
-
递归排序:对基准元素左边和右边的子数组继续使用相同的分区方法递归进行排序,直到子数组的大小为 1 或 0。
4.3 、代码中的实现:
void FbQuickSort(int* a, int left, int right)
{if (left >= right)return;int pre = left; // 前指针,初始化为 leftint cur = left + 1; // 后指针,初始化为 left + 1int key = a[left]; // 选择基准元素为 leftwhile (cur <= right){if (a[cur] < key) // 如果当前元素小于基准元素{pre++; // 前指针右移Swap(&a[cur], &a[pre]); // 交换当前元素与前指针指向的元素}cur++; // 后指针继续右移}// 最后将基准元素与前指针指向的元素交换Swap(&a[left], &a[pre]);// 递归对左边和右边的子数组进行快速排序FbQuickSort(a, left, pre - 1);FbQuickSort(a, pre + 1, right);
}
解释:
- 基准元素:
key = a[left]
,我们选择数组的第一个元素作为基准。 - 前后指针初始化:
pre = left
,cur = left + 1
。pre
记录当前已经排序好的区域的边界,cur
用来遍历剩余的部分。 - 主循环:
while (cur <= right)
让后指针cur
遍历整个数组。在每次扫描中,检查当前元素是否小于基准元素,如果是,则将其与前指针pre
所指向的元素交换,同时pre
自增。 - 基准交换:
Swap(&a[left], &a[pre])
将基准元素交换到其最终位置,这时pre
的位置已经确定了基准元素应该放置的位置。左边是比基准小的元素,右边是比基准大的元素。 - 递归调用:对基准元素左右两侧的子数组递归进行快速排序。
4. 4 、动画展示
相关文章:
排序算法 -快速排序
文章目录 1. 快速排序(Quick Sort)1.1、 简介1.2、 快速排序的步骤 2. Hoare 版本2.1、 基本思路1. 分区(Partition)2. 基准选择(Pivot Selection)3. 递归排序(Recursive Sorting) 2…...
K8S 查看pod节点的磁盘和内存使用情况
查看某个节点的磁盘使用率: kubectl exec -it pod名称 -n 命名空间 – df -h 查询所有节点的已使用内存: kubectl top pods --all-namespaces | grep itsm 查询某个节点的总内存, kubectl describe pod itsr-domain-59f4ff5854-hzb68 --nam…...
华为HCIP——MSTP/RSTP与STP的兼容性
一、MSTP/RSTP与STP的兼容性的原理: 1.BPDU版本号识别:运行MSTP/RSTP协议的交换机会根据收到的BPDU(Bridge Protocol Data Unit,桥协议数据单元)版本号信息自动判断与之相连的交换机的运行模式。如果收到的是STP BPDU…...
AI 大模型如何重塑软件开发流程:现状与未来展望
随着人工智能技术的飞速发展,AI 大模型的出现正在深刻改变软件开发行业的传统模式。从代码生成到智能测试,AI 已渗透到软件开发的各个环节,为开发者提供了前所未有的效率提升,同时也带来了全新的挑战与思考。在本文中,…...
3步实现贪吃蛇
方法很简单,打开页面,复制,粘贴 一.整体思维架构 我们根据游戏的开始,运行,结束,将整个游戏划分成三个部分。在每个部分下面又划分出多个功能,接下来我们就根据模块一一实现功能。 二.Gamesta…...
华东师范大学数学分析第五版PDF习题答案上册及下册
“数学分析”是数学专业最重要的一门基础课程,也是报考数学类专业硕士研究生的专业考试科目。为了帮助、指导广大读者学好这门课程,编者编写了与华东师范大学数学科学学院主编的《数学分析》(第五版)配套的辅导用书,以帮助读者加深对基本概念…...
MySQL之联合查询
前文我们了解到了数据库设计的范式要求,故生活中很多相互关联的数据被拆分开来,但彼此之间通过某种条件链接,此文联合查询就是通过多表之间的连接关系,来查询我们想要的数据,即 《联合查询》 1. 联合查询简介 1.1 为什…...
[C/C++] 定位新表达式 placement new
在C中,表达式 new (ptr) T(); 展示了一种特殊的内存分配和对象构造方式,这被称为定位新表达式(placement new)。 通常,当我们使用 new 关键字时,它会在堆上动态分配内存,并调用相应的构造函数来…...
【MySQL】MySQL的笛卡尔积现象是什么?简单说说
笛卡尔积好像是个科学家,也是个学术概念,在MySQL中表示交叉连接,即:匹配一切所有的可能 举例如下: 准备两张表 【employee表】 emp_idlast_namedept_id1Smith12Johnson2 【department表】 dept_iddepartment_nam…...
《InsCode AI IDE:编程新时代的引领者》
《InsCode AI IDE:编程新时代的引领者》 一、InsCode AI IDE 的诞生与亮相二、独特功能与优势(一)智能编程体验(二)多语言支持与功能迭代 三、实际应用与案例(一)游戏开发案例(二&am…...
微搭低代码私有化部署搭建教程
目录 1 下载远程工具2 查看服务器配置3 下载部署包4 安装部署包5 系统登录总结 最近微搭推出了私有化部署版本,正好官方赠送了我一台云服务器,练习一下部署的过程,本篇作为一个实践的记录 1 下载远程工具 一般我们使用的是云服务器ÿ…...
【在Linux世界中追寻伟大的One Piece】多路转接epoll(续)
目录 1 -> epoll的工作方式 1.1 -> 水平触发(Level Triggered)工作模式 1.2 -> 边缘触发(Edge Triggered)工作模式 2 -> 对比LT与ET 3 -> 理解ET模式和非阻塞文件描述符 4 -> epoll的使用场景 5 -> epoll示例 5.1 -> epoll服务器(LT模式) 5.2…...
【不写for循环】玩玩行列
利用numpy的并行操作可以比纯用Python的list快很多,不仅如此,代码往往精简得多。 So, 这篇来讲讲进阶的广播和花哨索引操作,少写几个for循环()。 目录 一个二维的例题 一个三维的例题 解法一 解法二 更难的三维例题…...
【Nginx】反向代理Https时相关参数:
在Nginx代理后台HTTPS服务时,有几个关键的参数需要配置,以确保代理服务器能够正确地与后端服务器进行通信。一些重要参数的介绍: proxy_ssl_server_name:这个参数用于指定是否在TLS握手时通过SNI(Server Name Indicati…...
第 17 章 - Go语言 上下文( Context )
在Go语言中,context包为跨API和进程边界传播截止时间、取消信号和其他请求范围值提供了一种方式。它主要应用于网络服务器和长时间运行的后台任务中,用于控制一组goroutine的生命周期。下面我们将详细介绍context的定义、使用场景、取消和超时机制&#…...
Android Framework AMS(16)进程管理
该系列文章总纲链接:专题总纲目录 Android Framework 总纲 本章关键点总结 & 说明: 说明:本章节主要解读AMS 进程方面的知识。关注思维导图中左上侧部分即可。 我们本章节主要是对Android进程管理相关知识有一个基本的了解。先来了解下L…...
STM32设计防丢防摔智能行李箱
目录 目录 前言 一、本设计主要实现哪些很“开门”功能? 二、电路设计原理图 1.电路图采用Altium Designer进行设计: 2.实物展示图片 三、程序源代码设计 四、获取资料内容 前言 随着科技的不断发展,嵌入式系统、物联网技术、智能设备…...
【异常解决】Linux shell报错:-bash: [: ==: 期待一元表达式 解决方法
博主介绍:✌全网粉丝21W,CSDN博客专家、Java领域优质创作者,掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域✌ 技术范围:SpringBoot、SpringCloud、Vue、SSM、HTML、Nodejs、Python、MySQL、PostgreSQL、大数据、物…...
ML 系列: 第 23 节 — 离散概率分布 (多项式分布)
目录 一、说明 二、多项式分布公式 2.1 多项式分布的解释 2.2 示例 2.3 特殊情况:二项分布 2.4 期望值 (Mean) 2.5 方差 三、总结 3.1 python示例 一、说明 伯努利分布对这样一种情况进行建模:随机变量可以采用两个可能的值&#…...
Webpack 1.13.2 执行 shell 命令解决 打印时没有背景色和文字颜色的问题
这是因为 Webpack 1.13.2 不支持新的插件钩子 API。Webpack 1 的插件系统使用的是 plugin 方法,而不是 Webpack 4 中的 hooks。 在 Webpack 1 中,你可以使用以下代码来确保 sed 命令在打包完成后执行: const { exec } require(child_proce…...
C++构造函数详解
构造函数详解:C 中对象初始化与构造函数的使用 在 C 中,构造函数是一种特殊的成员函数,它在创建对象时自动调用,用来初始化对象的状态。构造函数帮助我们确保每个对象在被创建时就处于一个有效的状态,并且在不传递任何…...
POI实现根据PPTX模板渲染PPT
目录 1、前言 2、了解pptx文件结构 3、POI组件 3.1、引入依赖 3.2、常见的类 3.3、实现原理 3.4、关键代码片段 3.4.1、获取ppt实例 3.4.2、获取每页幻灯片 3.4.3、循环遍历幻灯片处理 3.4.3.1、文本 3.4.3.2、饼图 3.4.3.3、柱状图 3.4.3.4、表格 3.4.3.5、本地…...
【论文模型复现】深度学习、地质流体识别、交叉学科融合?什么情况,让我们来看看
文献:蓝茜茜,张逸伦,康志宏.基于深度学习的复杂储层流体性质测井识别——以车排子油田某井区为例[J].科学技术与工程,2020,20(29):11923-11930. 本文目录 一、前言二、文献阅读-基于深度学习的复杂储层流体性质测井识别2.1 摘要2.2 当前研究不足2.3 本文创新2.4 论文…...
树的直径计算:算法详解与实现
树的直径计算:算法详解与实现 1. 引言2. 算法概述3. 伪代码实现4. C语言实现5. 算法分析6. 结论在图论中,树的直径是一个关键概念,它表示树中任意两点间最长路径的长度。对于给定的树T=(V,E),其中V是顶点集,E是边集,树的直径定义为所有顶点对(u,v)之间最短路径的最大值。…...
conda创建 、查看、 激活、删除 python 虚拟环境
1、创建 python 虚拟环境 ,假设该环境命名为 “name”。 conda create -n name python3.11 2、查看 python 虚拟环境。 conda info -e 3、激活使用 python 虚拟环境。 conda activate name 4、删除 python 虚拟环境 conda remove -n name --all 助力快速掌握数据集…...
vs2022搭建opencv开发环境
1 下载OpenCV库 https://opencv.org/ 下载对应版本然后进行安装 将bin目录添加到系统环境变量opencv\build\x64\vc16\bin 复制该路径 打开高级设置添加环境变量 vs2022新建一个空项目 修改属性添加头文件路径和库路径 修改链接器,将OpenCV中lib库里的o…...
NVIDIA NIM 开发者指南:入门
NVIDIA NIM 开发者指南:入门 NVIDIA 开发者计划 想要了解有关 NIM 的更多信息?加入 NVIDIA 开发者计划,即可免费访问任何基础设施云、数据中心或个人工作站上最多 16 个 GPU 上的自托管 NVIDIA NIM 和微服务。 加入免费的 NVIDIA 开发者计…...
探索Python网络请求新纪元:httpx库的崛起
文章目录 **探索Python网络请求新纪元:httpx库的崛起**第一部分:背景介绍第二部分:httpx库是什么?第三部分:如何安装httpx库?第四部分:简单的库函数使用方法1. 发送GET请求2. 发送POST请求3. 超…...
学了Arcgis的水文分析——捕捉倾泻点,河流提取与河网分级,3D图层转要素失败的解决方法,测量学综合实习网站存着
ArcGIS水文分析实战教程(7)细说流域提取_汇流域栅格-CSDN博客 ArcGIS水文分析实战教程(6)河流提取与河网分级_arcgis的dem河流分级-CSDN博客 ArcGIS水文分析实战教程(5)细说流向与流量-CSDN博客 ArcGIS …...
QQ 小程序已发布,但无法被搜索的解决方案
前言 我的 QQ 小程序在 2024 年 8 月就已经审核通过,上架后却一直无法被搜索到。打开后,再在 QQ 上下拉查看 “最近使用”,发现他出现一下又马上消失。 上线是按正常流程走的,开发、备案、审核,没有任何违规…...
网站制作的步骤不包括哪些/百度关键词搜索排行榜
本篇内容将简要分析聊天机器人的发展历史以及在某段历史中的代表性产品。虽然聊天机器人技术随着近年来人工智能的发展而持续演进,但事实上在人工智能大潮出现之前已经诞生了一些聊天机器人产品。为了让读者能够全面了解整个聊天机器人的演进过程,我们把…...
哈尔滨制作网站企业/百度推广客户端下载
https://blog.csdn.net/qq_15001229/article/details/79535037转载于:https://www.cnblogs.com/duandian/p/9550012.html...
做美食网站的素材图片/免费站推广网站在线
集群分发脚本 #!/bin/bash #1 获取输入参数个数,如果没有参数,直接退出 pcount$# if((pcount0)); then echo no args; exit; fi #2 获取文件名称 p1$1 fnamebasename $p1 echo fname$fname #3 获取上级目录到绝对路径 pdircd -P $(dirname $p1)…...
做网站最低多少钱/百度推广入口
Analysis Service 2012 Architecture – One Product, Two Models 在之前SQL Server 2008 R2 版本中的分析服务实际上只有一个版本 – 就是我们所熟悉的多维数据模型 Multidimensional Model. 但是在 SQL Server 2012 版本中, 除了这个多维数据模型外还多了另外一种模型 – 表格…...
织梦网站制作费用/新网站seo外包
????????关注后回复 “进群” ,拉你进程序员交流群????????作者丨okay来源丨扩展迷EXTFANS(ID:infinitydaily)9月7日晚,苹果正式宣布将于9月15日正式召开新品发布会。届时iOS 15、iPhone 13、新AirPod…...
wordpress目录路径/阜新网络推广
今天我看了电影《入殓师》,很令人感动和温暖的片子。在这里,摘录了里面几句令我印象深刻的台词: “世界上任何地方都是我们的新居,周游世界,来个演奏之旅吧。这是我的求婚誓言,可现实太残酷了。不对&#x…...