排序(数据结构)

排序(数据结构)

一. 排序概念及运用

排序在数据结构中是非常重要的一部分,所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作

在生活中也有很多的应用,比如当我们搜索一款产品时候,我们可以选择按销量多少的顺序来给我们推荐产品,也可以按照价格高低来给我们推荐产品,所以排序在生活中也是很常见的。

1.1插入排序

(1)直接插入排序

上面就是一些常见的排序算法,首先我们来认识一下插入排序,插入排序又分为直接插入排序和希尔排序,直接插入排序是比较好理解的,比如我们日常生活中的扑克牌游戏,当我们拿到牌的时候我们会习惯性的直接将牌按我们想要的顺序排列,如下:

 

那么希尔排序又是怎么回事呢? 我还是用一张清晰的思路图来向大家展示:

void InitSort(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; } }

那么对于直接插入来说,这个算法的时间复杂度是多少呢?大家可以看我们的代码是有两层嵌套的,也就是说如果有最坏的情况发生的话,我们的时间复杂度为O(n^2),但是最好的情况是O(n)。

(2)希尔排序

我们在直接插入排序中,当数组为降序时,我们的时间复杂度会高一点,那么有没有什么办法可以得到优化呢?此时就要说我们的希尔排序了,希尔排序法又称缩小增量法。希尔排序法的基本思想是:先选定一个整数(通常是gap = n/3+1),把待排序文件所有记录分成各组,所有的距离相等的记录分在同一组内,并对每一组内的记录进行排序,然后gap=gap/3+1得到下一个整数,再将数组分成各组,进行插入排序,当gap=1时,就相当于直接插入排序。它是在直接插入排序算法的基础上进行改进而来的,综合来说它的效率肯定是要高于直接插入排序算法的。

总结下来就是第一步预排序,第二步直接插入排序

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; } } }

 对于希尔排序,我们直接的思路是比较好理解的,但是如果我们写成代码的话,是有点不好理解的,尤其是对于gap分组再嵌套进入循环,大家可以借助画图的方法深入理解一下。对于希尔排序的时间复杂度,希尔排序时间复杂度不好计算,因为 gap 的取值很多,导致很难去计算,因此很多书中给出的希尔排序的时间复杂度都不固定。但是外层循环的时间复杂度可以直接给出为: O(log2 n) 或者 O(log3 n) ,即 O(log n)。总之希尔排序的效率是高于直接插入排序的。

1.2 选择排序

 

选择排序的基本思想:每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完

(1)直接选项排序

1. 在元素集合 array[i]--array[n-1] 中选择关键码最大(小)的数据元素。2. 若它不是这组元素中的最后一个(第一个)元素,则将它与这组元素中的最后一个(第⼀          个)元素交换。3. 在剩余的 array[i]--array[n-2](array[i+1]--array[n-1]) 集合中,重复上述步骤,直到集合      剩余1个元素。
Swap(int* a, int* b) { int temp; temp = *a; *a = *b; *b = temp; } void SelectSort(int* arr, int n) { for (int i = 0; i < n; i++) { int begin = i; int mini = i; //找最小的值 for (int j = i + 1; j < n; j++) { if (arr[j] < arr[mini]) { mini = j; } } //找到最小的值了,i和mini位置的数据进行交换 Swap(&arr[i], &arr[mini]); } }

 这一部分的算法思路还是很好理解的,我们进行了两次嵌套循环,在每一次中找到最小的值,然后将最小的值放在第一位,同时这个算法的时间复杂度跟我们的直接插入排序是一样的,最差情况是O(n^2),但是我们能不能换一个思路,我们在找最小值的情况下能不能直接找最大值,同时进行寻找,那么我们的时间效率会不会提高呢?

void SelectSort2(int* arr, int n)//优化 { int begin = 0; int end = n - 1; while (begin < end) { int mini = begin, maxi = begin; for (int i = begin+1; i <= end; i++) { if (arr[i] > arr[maxi]) { maxi = i; } if (arr[i] < arr[mini]) { mini = i; } } Swap(&arr[mini], &arr[begin]); Swap(&arr[maxi], &arr[end]); ++begin; --end; } }

 这是我们按照之后的思路写的算法,根据我的代码,我们是同时找最小值和最大值,最后在交换,但是代码出现了问题,最后并没有按我们想要的排序,那么问题到底出现在哪了呢?

 所以我们还要处理这种特殊的情况,我们就要在交换之前再加上一个if条件:

直接选择排序的特性总结:1. 直接选择排序思考非常好理解,但是效率不是很好。实际中很少使用。2. 时间复杂度: O(n^2 )。3. 空间复杂度: O(1)。

(2)堆排序

堆排序也是属于选择排序的一种,堆排序(Heapsort)是指利用堆积树(堆)这种数据结构所设计的一种排序算法,它是选择排序的一种。它是通过堆来进行选择数据。需要注意的是排升序要建大堆,排降序建小堆。在前面学习堆的时候我们也详细的讲解过堆排序的原理思路以及详细的代码展示,大家可以去看我之前写的。那么堆排序的时间复杂度是O(nlogn)。

对于今天的两大种排序算法来说,在插入排序中,希尔排序是直接插入排序的优化,效率提高了不少,在选择排序中呢,我们的直接选择排序的时间复杂度是比较高的,也就是说这个排序算法的效率是比较低的,在平时的计算中我们是不选择的,但是我们也要了解这种算法。

 

 

 

Read more

Qwen3-Embedding-4B部署教程:llama.cpp集成详细步骤

Qwen3-Embedding-4B部署教程:llama.cpp集成详细步骤 1. 技术背景与学习目标 通义千问3-Embedding-4B是阿里云Qwen3系列中专为文本向量化任务设计的高性能模型,参数规模达40亿,支持高达32,768个token的长文本编码,并输出2560维高质量语义向量。该模型于2025年8月开源,采用Apache 2.0协议,允许商用,适用于跨语言检索、知识库构建、文档去重、聚类分析等场景。 本文是一篇从零开始的实战部署指南,重点介绍如何将 Qwen/Qwen3-Embedding-4B 模型通过 llama.cpp 进行本地化部署,并结合 vLLM 和 Open WebUI 构建完整的可视化知识库系统。读者将掌握以下技能: * 下载并转换Qwen3-Embedding-4B为GGUF格式 * 使用llama.cpp运行嵌入模型 * 部署vLLM服务以提供API接口 * 配置Open WebUI实现交互式知识库体验 * 验证embedding效果及性能指标 本教程适合具备基础Linux命令和Python环境管理能力的开发者,前置知识包括D

By Ne0inhk
Continue插件实现本地部署一个“cursor”或“github copilot”

Continue插件实现本地部署一个“cursor”或“github copilot”

本地部署 AI 代码助手,制作一个 Cursor/GitHub Copilot 的替代版本 一 需求分析 * 本地部署的定义与优势(数据隐私、离线使用、定制化)。 * Cursor 与 GitHub Copilot 的功能(代码补全、对话交互、模型差异)。 * 本地部署的AI 代码助手适用场景:企业内网开发、敏感数据环境。 二 环境准备与工具选择 * 硬件要求:GPU 要对应上你所部署的模型大小 * 模型选择:qwen2.5-14b-instruct (这里选择千问的大模型) 三 部署开源模型 这里不详细介绍具体的大模型部署的具体过程,部署完成之后,你应该得到对应的模型的以下信息 model: "qwen2.5-14b-instruct" apiBase: "http://你的ip地址(自己的本机就写localhost)

By Ne0inhk
AIGC实战测评:蓝耘元生代通义万相2.1图生视频的完美部署~

AIGC实战测评:蓝耘元生代通义万相2.1图生视频的完美部署~

文章目录 * 👏什么是图生视频? * 👏通义万相2.1图生视频 * 👏开源仓库代码 * 👏蓝耘元生代部署通义万相2.1图生视频 * 👏平台注册 * 👏部署通义万相2.1图生视频 * 👏使用通义万相2.1图生视频 * 👏总结 👏什么是图生视频? 图生视频是一种通过图像生成技术,结合文本信息生成视频的创新方式。通过输入一张图像和相关的描述文本,系统能够根据这些输入生成一个符合描述的视频。该技术利用深度学习和计算机视觉技术,将静态图像转化为动态视频,实现视觉内容的快速生成。这种技术的应用广泛,涵盖了内容创作、影视制作、广告生成等多个领域。 👏通义万相2.1图生视频 阿里巴巴旗下“通义”品牌宣布,其AI视频生成模型“通义万相Wan”正式推出独立网站,标志着其生成式AI技术的重大进展。新网站现已开放(网址:wan.video),用户可直接登录体验“文本生成视频”和“图像生成视频”功能,无需本地部署,极大降低了使用门槛。此外,每天登录网站还可获赠积分,激励用户持续探索。 文章链接:https:

By Ne0inhk

GitHub Copilot 使用笔记

GitHub Copilot 是 VSCode 自带的 AI Agent 插件,需要登录 GitHub 账号使用,分为免费版和付费版。 关于个人额度,可以在 Github 的 Copilot 菜单里查看 支持模型 添加第三方模型 通过 Manage Models 选中对应厂商。 可以通过 OpenRouter 来导入免费的模型,需要先到 OpenRouter 注册 API Key,输入后即可使用,也可以使用兼容 OpenAI 接口的三方 API,比如 硅基流动 SiliconFlow 使用帮助信息 切换到 Ask 模式,输入 /help 即可获取帮助命令,可以查看当前有什么可用命令和使用方法。 翻译后的内容,方便查看,

By Ne0inhk