认知算法(九)

简介: 认知算法(九),一起来学习吧。

嗨,欢迎来到异星球,我是小怪同志。这篇文章主要讲认识算法,请一起学习吧。

一、归并排序

归并排序(Merge sort)是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。

作为一种典型的分而治之思想的算法应用,归并排序的实现由两种方法:

自上而下的递归(所有递归的方法都可以用迭代重写,所以就有了第 2 种方法);
自下而上的迭代;
在《数据结构与算法 JavaScript 描述》中,作者给出了自下而上的迭代方法。但是对于递归法,作者却认为:

However, it is not possible to do so in JavaScript, as the recursion goes too deep for the language to handle.

然而,在 JavaScript 中这种方式不太可行,因为这个算法的递归深度对它来讲太深了。

说实话,我不太理解这句话。意思是 JavaScript 编译器内存太小,递归太深容易造成内存溢出吗?还望有大神能够指教。

和选择排序一样,归并排序的性能不受输入数据的影响,但表现比选择排序好的多,因为始终都是 O(nlogn) 的时间复杂度。代价是需要额外的内存空间。

  1. 算法步骤
    1.申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列;

    2.设定两个指针,最初位置分别为两个已经排序序列的起始位置;

    3.比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置;

    4.重复步骤 3 直到某一指针达到序列尾;

    5.将另一序列剩下的所有元素直接复制到合并序列尾。

二、代码实现

int min(int x, int y) {

return x < y ? x : y;

}
void merge_sort(int arr[], int len) {

int *a = arr;
int *b = (int *) malloc(len * sizeof(int));
int seg, start;
for (seg = 1; seg < len; seg += seg) {
    for (start = 0; start < len; start += seg * 2) {
        int low = start, mid = min(start + seg, len), high = min(start + seg * 2, len);
        int k = low;
        int start1 = low, end1 = mid;
        int start2 = mid, end2 = high;
        while (start1 < end1 && start2 < end2)
            b[k++] = a[start1] < a[start2] ? a[start1++] : a[start2++];
        while (start1 < end1)
            b[k++] = a[start1++];
        while (start2 < end2)
            b[k++] = a[start2++];
    }
    int *temp = a;
    a = b;
    b = temp;
}
if (a != arr) {
    int i;
    for (i = 0; i < len; i++)
        b[i] = a[i];
    b = a;
}
free(b);

}

相关文章
|
3月前
|
存储 人工智能 自然语言处理
Lakehouse x AI ,打造智能 BI 新体验
本文整理自瓴羊的王璟尧老师与镜舟科技石强老师的联合分享,围绕 Quick BI 在智能 BI 场景中的落地实践,深入探讨了 StarRocks 如何凭借 MPP 架构、实时分析能力与 AI 原生支持,成为智能分析的理想 Lakehouse 引擎底座,助力 BI 从“被动查询”迈向“主动决策”,开启数据“会说话”的新体验。
|
机器学习/深度学习 人工智能 监控
基于YOLOv8的人体检测、行人识别项目|完整源码数据集+PyQt5界面+完整训练流程+开箱即用!
本项目基于YOLOv8实现人体检测与行人识别,集成PyQt5图形界面,支持图片、视频、摄像头等多种输入方式。包含完整训练代码、数据集及部署教程,开箱即用,适用于安防监控、人数统计等场景。
|
4月前
|
缓存 Windows
电脑小白必看:C 盘满了怎么清理?软件搬到 D 盘的超简单步骤
C盘空间不足导致电脑卡顿?试试这些方法优化!首推FreeMove工具,不到1MB,简单两步搬软件,解放C盘空间。此外,清理临时文件、转移用户文件夹至D盘、调整虚拟内存位置、使用符号链接等技巧也能有效缓解压力。注意:系统核心目录不可移动,操作前请备份重要数据,确保安全!
374 5
|
算法 编译器 C++
【C++篇】领略模板编程的进阶之美:参数巧思与编译的智慧
【C++篇】领略模板编程的进阶之美:参数巧思与编译的智慧
252 2
|
小程序 JavaScript 前端开发
如何开发一个微信小程序
如何开发一个微信小程序
|
Web App开发 测试技术 API
Web自动化测试框架(基础篇)--Selenium WebDriver工作原理和环境搭建
本文详细介绍了Selenium WebDriver的工作原理,包括其架构、通信机制及支持的浏览器,并指导读者如何在Python环境下搭建Selenium WebDriver的测试环境,从安装Python和Selenium库到编写并运行第一个自动化测试脚本。
687 0
|
关系型数据库 MySQL
MySQL 的 union 和union all 的区别
【5月更文挑战第4天】MySQL 的 union 和union all 的区别
583 7
Linux磁盘配额
在Linux系统中,当用户的空间占用接近或超过预设的软限制时,系统会警告用户磁盘空间将满。软限制是允许用户使用的磁盘空间的最大值,在此限制下,用户仍有宽限期来减少空间使用。如果在宽限期内用户未减少空间占用,达到硬限制,软限制将升级为硬限制。硬限制是用户可以使用的绝对最大值。默认的宽限期是7天,如果超过这个期限,用户的空间限制会立即降低到硬限制。
|
存储 弹性计算 安全
阿里云服务器租用价格参考,2核4G、4核8G、8核16G最新收费标准
阿里云服务器2核4G、4核8G、8核16G配置租用价格参考,2024年阿里云产品再一次降价,降价之后2核4G配置按量收费最低收费标准为0.225元/小时,按月租用标准收费标准为68.0元/1个月。4核8G配置的阿里云服务器按量收费标准最低为0.45元/小时,按月租用标准收费标准为216.0元/1个月。8核16G配置的阿里云服务器按量收费标准最低为0.9元/小时,按月租用标准收费标准为432.0元/1个月。云服务器实例规格的地域和实例规格不同,收费标准不一样,下面是2024年阿里云服务器2核4G、4核8G、8核16G配置的最新租用收费标准。
阿里云服务器租用价格参考,2核4G、4核8G、8核16G最新收费标准
|
人工智能 IDE JavaScript
分享一个很好用的代码辅助AI工具CodeGeeX2
分享一个很好用的代码辅助AI工具CodeGeeX2
374 1