深入探索JavaScript中的5种经典算法

news2024/9/23 13:18:44

在本文中,您将了解到:
冒泡排序、快速排序等常见排序算法原理及其在 JavaScript 中的实现;

在这里插入图片描述

经典算法示例

1. 冒泡排序算法

冒泡排序算法:冒泡排序是一种简单但效率较低的排序算法。它通过多次遍历数组,比较相邻元素并交换位置来实现排序。

原理图示

在这里插入图片描述

js实现

function bubbleSort(arr) {
  const len = arr.length;
  for (let i = 0; i < len - 1; i++) {
    // 每次遍历比较相邻元素并交换位置,将最大的元素移到末尾
    for (let j = 0; j < len - i - 1; j++) {
      if (arr[j] > arr[j + 1]) {
        // 使用解构赋值进行元素交换
        [arr[j], arr[j + 1]] = [arr[j + 1], arr[j]];
      }
    }
  }
  
 return arr;
}
// 示例用法:
const numbers = [4, 2, 6, 8, 3];
console.log(bubbleSort(numbers)); // 输出: [2,3,4,6,8]

bubbleSort 函数接受一个数组作为参数,并使用嵌套循环遍历数组来执行冒泡排序。内部循环通过比较相邻元素并根据需要交换它们的位置来实现排序。外部循环控制总共要进行多少轮排序操作。

2. 快速排序算法

快速排序算法:快速排序是一种高效的分治算法。它选择一个基准元素,并将数组分成两个子数组,其中一个小于基准值,另一个大于基准值。然后递归地对这两个子数组进行快速排序。

原理图示

在这里插入图片描述

js实现

function quickSort(arr) {
  if (arr.length <= 1) {
    return arr;
  }
  
  const pivot = arr[Math.floor(arr.length / 2)]; // 选择数组中间元素作为基准值
  const left = [];
  const right = [];

   for (let i =0; i<arr.length;i++){
     if(i!== Math.floor(arr.length/2)){
       if(arr[i]<pivot){
         left.push(arr[i]);
       } else{
          right.push(arr[i]);
       }
     } 
   }

   return [...quickSort(left),pivot,...quickSort(right)];
}
// 示例用法:
const numbers = [4, 2, -3, 6, -8];
console.log(quickSort(numbers)); // 输出: [-8,-3,2,4,6]

quickSort 函数接受一个数组作为参数,并通过递归方式实现快速排序。首先选择数组中间的元素作为基准值(也可以选择其他位置),然后将小于基准值的元素放入左侧数组 left,大于等于基准值的元素放入右侧数组 right。最后,使用递归调用对左右子数组进行快速排序,并合并结果。

3. 二分查找算法

二分查找算法:二分查找是在有序数组中查找特定元素的常用方法。它通过将目标值与数组中间元素进行比较,并根据比较结果缩小搜索范围直到找到目标值或确定不存在。

原理图示

在这里插入图片描述

js实现

function binarySearch(arr, target) {
  let left = 0;
  let right = arr.length - 1;

   while (left <= right) {
    const mid = Math.floor((left + right) / 2);

     if (arr[mid] === target) {
      return mid; // 找到目标元素,返回索引位置
    } else if (arr[mid] < target) {
      left = mid + 1; // 目标在右侧子数组中
    } else {
      right = mid - 1; // 目标在左侧子数组中
    }
  }

   return -1; // 没有找到目标元素,返回-1表示失败
}
// 示例用法:
const numbers = [2, 4, 6, 8,10];
console.log(binarySearch(numbers,6)); // 输出: 2

binarySearch 函数接受一个已排序的数组 arr 和目标值 target。通过不断将搜索范围缩小至左半部分或右半部分来实现二分查找。

4. 阶乘函数

阶乘函数用于计算给定数字 n 的阶乘(n!)。递归和迭代都可以实现该功能。

原理图示

在这里插入图片描述

js实现

function factorial(n) {
  if (n === 0 || n === 1) {
    return 1; // 当输入为0或1时,直接返回1
  } else {
    return n * factorial(n - 1); // 使用递归计算阶乘
  }
}

// 示例用法:
console.log(factorial(5)); // 输出: 120

factorial 函数接受一个非负整数 n 参数,并通过递归方式计算其阶乘。当输入值为0或1时,直接返回结果为1;否则,在每一次递归调用过程中,将当前参数 n 和 n-1 相乘。重复这个过程直到 n 值减至0或者1。

5. 斐波那契数列

斐波那契数列:斐波那契数列是由前两个数字开始,并且每个后续数字都等于前两个数字之和的序列。使用递归或循环方法都可以生成斐波那契数列。

原理图示

在这里插入图片描述

js实现

function fibonacci(n) {
  if (n === 0) {
    return 0; // 当输入为0时,直接返回0
  } else if (n === 1 || n === 2) {
    return 1; // 当输入为1或2时,直接返回1
  } else {
    let a = 1;
    let b = 1;

     for (let i = 3; i <= n; i++) {
      const temp = a + b;
      a = b;
      b = temp;
    }

     return b; // 返回第n个斐波那契数列的值
 }
}
// 示例用法:
console.log(fibonacci(6)); // 输出:8

fibonacci 函数接受一个非负整数 n 参数,并通过迭代方式计算其对应位置上的斐波那契数。当输入值为0时,直接返回结果为0;当输入值为1或2时,也直接返回结果为1;否则,在每一次迭代过程中利用两个变量 a 和 b 来保存当前位置和前一个位置的斐波那契数。通过不断更新这两个变量来求解下一个位置上的斐波那契数。

总结

算法的使用意义:

  1. 提高性能:使用高效的算法可以提升程序的执行效率。例如,对大型数据集进行排序时,使用快速排序比简单的冒泡或选择排序更有效率。
  2. 数据处理与查询:搜索算法允许我们在给定数据集中查找特定元素。例如,通过二分查找可以快速地在已经排好序的数组中查找目标值。
  3. 优化资源利用:某些问题可能存在重复计算或者多次使用相同结果的情况。递归和动态规划是解决这类问题非常有用的方法。它们可以帮助我们避免重复计算,并且将问题拆解为子问题来求解,从而节省时间和资源。
  4. 程序设计思维培养:学习和理解常见算法可以培养抽象化思考能力以及良好的程序设计习惯。熟悉各种类型的问题并掌握相应的解决方案,有助于编写清晰且可扩展性高的代码。
  5. 面试和竞争力:在面试过程中,算法问题是常见的考察点。掌握常见算法并能够灵活运用,可以提升求职竞争力,并展示自己的技术水平。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/901198.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

JVM前世今生之JVM内存模型

JVM内存模型所指的是JVM运行时区域&#xff0c;该区域分为两大块 线程共享区域 堆内存、方法区&#xff0c;即所有线程都能访问该区域&#xff0c;随着虚拟机和GC创建和销毁 线程独占区域 虚拟机栈、本地方法栈、程序计数器&#xff0c;即每个线程都有自己独立的区域&#…

生成式AI系列 —— DCGAN生成手写数字

1、模型构建 1.1 构建生成器 # 导入软件包 import torch import torch.nn as nnclass Generator(nn.Module):def __init__(self, z_dim20, image_size256):super(Generator, self).__init__()self.layer1 nn.Sequential(nn.ConvTranspose2d(z_dim, image_size * 32,kernel_s…

基于web的停车场收费管理系统/基于springboot的停车场管理系统

摘 要 随着汽车工业的迅猛发展&#xff0c;我国汽车拥有量急剧增加。停车场作为交通设施的组成部分,随着交通运输的繁忙和不断发展&#xff0c;人们对其管理的要求也不断提高&#xff0c;都希望管理能够达到方便、快捷以及安全的效果。停车场的规模各不相同,对其进行管理的模…

深入理解ASP.NET Core中的Program类和Startup类

一、背景介绍 本文以ASP.NET Core 6以前版本API程序来说明。 在我们新建ASP.NET Core项目时&#xff0c;项目根目录下会自动建立Program.cs和Startup.cs两个类文件。 Program.cs 作为 Web 应用程序的默认入口&#xff0c;不做任何修改的情况下&#xff0c;会调用同目录下 Star…

Dubbo 融合 Nacos 成为注册中心

快速上手 Dubbo 融合 Nacos 成为注册中心的操作步骤非常简单&#xff0c;大致步骤可分为“增加 Maven 依赖”以及“配置注册中心“。 增加 Maven 依赖 只需要依赖Dubbo客户端即可&#xff0c;关于推荐的使用版本&#xff0c;请参考Dubbo官方文档或者咨询Dubbo开发人员&#…

Vue 2 组件基础

一个简单的组件示例&#xff1a; <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</titl…

暴力模拟入门+简单:零件组装、塔子的签到题、塔子哥考试、平均像素值、换座位

暴力模拟入门 P1038 小红书-2022.9.23-零件组装 #include <bits/stdc.h> #include <cstdint> using namespace std;typedef long long LL; const int N 100001; int num[4]; LL d; vector<vector<LL>> v(4, vector<LL>(N));int main() {for(in…

python中的__name__是个啥?

pycharm中随便打开一个文件&#xff0c;在special variables中能看到一个__name__的变量 在很多python脚本中&#xff0c;也经常能看到if name "main"这样一行 所以_name_到底是个啥&#xff1f; 首先&#xff0c;我们可以确定这是一个str字符变量 “在 Python 中&…

06_布隆过滤器BloomFilter

06——布隆过滤器BloomFilter 一、是什么 由一个初始值都为零的bit数组和多个哈希函数构成&#xff0c;用来快速判断集合中是否存在某个元素 设计思想&#xff1a; 1. 目的&#xff1a;减少内存占用 1. 方式&#xff1a;不保存数据信息&#xff0c;只是在内存中做一个是否存…

【框架类】—MVVM框架

一、MVVM框架有哪些 Vue.jsReact.jsAngular.js 二、对MVVM的认识 1. MVC是什么 全称 Model View Controller, 它采用模型(Model)-视图(View)-控制器(controller)的方法把业务逻辑、数据与界面显示分离 2. MVVM的定义 MVVM是一种软件架构模式&#xff0c;它代表了模型 --视…

智慧工地监管一体化云平台源码 PC端、 手机端、 现场端

智慧工地管理平台是以物联网、移动互联网技术为基础&#xff0c;充分应用大数据、人工智能、移动通讯、云计算等信息技术&#xff0c;利用前端信息采通过人机交互、感知、决策、执行和反馈等&#xff0c;实现对工程项目內人员、车辆、安全、设备、材料等的智能化管理&#xff0…

Python 潮流周刊#16:优雅重要么?如何写出 Pythonic 的代码?

你好&#xff0c;我是猫哥。这里每周分享优质的 Python、AI 及通用技术内容&#xff0c;大部分为英文。标题取自其中两则分享&#xff0c;不代表全部内容都是该主题&#xff0c;特此声明。 本周刊由 Python猫 出品&#xff0c;精心筛选国内外的 250 信息源&#xff0c;为你挑选…

Linux(入门篇)

Linux&#xff08;入门篇&#xff09; Linux概述Linux是什么Linux的诞生Linux和Unix的渊源GNU/LinuxLinux的发行版Linux VS Windows Linux概述 Linux是什么 Linux是一个操作系统(OS) Linux的诞生 作者&#xff1a;李纳斯托瓦兹&#xff08;git也是他开发的&#x1f602;&am…

11. 实现业务功能--获取用户信息

目录 1. 实现 Controller 2. 单体测试 3. 修复返回值存在的缺陷 3.1 用户的隐私数据&#xff1a;密码的密文和盐不能显示 3.2 将值为 null 的字段可以进行过滤 3.3 时间的格式需要进行处理&#xff0c;如 yyyy-mmmm-ddd HH:mm:ss 3.4 data 属性没有返回 4. 实现前端页…

低代码平台全套源码,支持二次开发

低代码开发平台&#xff1a;只需要编写简单的配置文件即可构建企业级应用程序。 一、低代码PaaS平台可以在云端开发、部署、运行低代码应用程序。使用独立数据库模型&#xff0c;基于Kubernetes云原生技术&#xff0c;每个租户均可拥有一套独立的存储、数据库、代码和命名空间&…

光栅化之扫描填充三角形

重心坐标计算 重心坐标比较简单&#xff0c;取最大包围合再计算点是否在三角形内就行&#xff0c;再根据重心坐标返回的alpha,beta,gamma三个权重值计算 uv映射和depth深度缓冲值&#xff0c;因为是求的重心坐标&#xff0c;感觉效果比插值的要好一点。 求重心坐标 barycentr…

Qt 编译使用Bit7z库接口调用7z.dll、7-Zip.dll解压压缩常用Zip、ISO9660、Wim、Esd、7z等格式文件(一)

bit7z一个c静态库&#xff0c;为7-zip共享库提供了一个干净简单的接口 使用CMAKE重新编译github上的bit7z库&#xff0c;用来解压/预览iso9660&#xff0c;WIm&#xff0c;Zip,Rar等常用的压缩文件格式。z-zip库支持大多数压缩文件格式 导读 编译bit7z(C版本)使用mscv 2017编译…

C# 把dll打包到exe文件,真的可以 。文件批量转了ANSI编码

在 C# 中&#xff0c;将 DLL 文件打包到 EXE 文件中可以使用 ILRepack 工具。ILRepack 是一个开源的工具&#xff0c;可以合并多个 DLL 文件并将它们嵌入到一个 EXE 文件中&#xff0c;从而实现将 DLL 打包到 EXE 的功能。 以下是使用 ILRepack 工具打包 DLL 到 EXE 的步骤&…

CSDN今日热榜词云图

文章目录 C云原生人工智能和Python前沿技术软件工程后端javajavascriptphp区块链大数据移动开发嵌入式开发工具数据结构与算法微软技术测试游戏网络运维 C C果然还是应试语言&#xff0c;真题的占比竟然这么大。C之所以没出现&#xff0c;很有可能是在做词云的时候把加号当作非…