排序算法 (Sorting Algorithms)-JS示例

Top 10 Algorithms for Sorting Arrays in JavaScript 作者:禅与计算机程序设计艺术 1.简介 Sorting is an important and fundamental operation in computer science that requires a significant amount of time to implement correc 阅读详情

基本概念

排序算法是将一组数据按照特定顺序(通常是升序或降序)重新排列的算法。它是计算机科学中最基础也是最重要的算法之一。

核心特性

  • 稳定性:相等元素在排序后的相对位置不变
  • 时间复杂度:算法执行所需的时间
  • 空间复杂度:算法执行所需的额外存储空间
  • 原地排序:只需要常数级额外空间的排序算法

常见分类

  1. 比较排序:通过比较元素大小来决定顺序(如冒泡排序、快速排序)
  2. 非比较排序:不通过比较元素大小(如计数排序、桶排序)

经典排序算法 JS 示例

1. 冒泡排序 (Bubble Sort)

function bubbleSort(arr) {
    const n = arr.length;
    // 创建数组副本以避免修改原数组
    const result = [...arr];
    
    for (let i = 0; i < n - 1; i++) {
        let swapped = false;
        // 每轮将最大元素"冒泡"到末尾
        for (let j = 0; j < n - i - 1; j++) {
            if (result[j] > result[j + 1]) {
                // 交换元素
                [result[j], result[j + 1]] = [result[j + 1], result[j]];
                swapped = true;
            }
        }
        // 如果没有发生交换,说明数组已经有序
        if (!swapped) break;
    }
    
    return result;
}

// 示例使用
const arr1 = [64, 34, 25, 12, 22, 11, 90];
console.log('原数组:', arr1);
console.log('冒泡排序结果:', bubbleSort(arr1));

2. 选择排序 (Selection Sort)

function selectionSort(arr) {
    const n = arr.length;
    const result = [...arr];
    
    for (let i = 0; i < n - 1; i++) {
        // 找到未排序部分的最小元素索引
        let minIndex = i;
        for (let j = i + 1; j < n; j++) {
            if (result[j] < result[minIndex]) {
                minIndex = j;
            }
        }
        // 将最小元素与未排序部分的第一个元素交换
        if (minIndex !== i) {
            [result[i], result[minIndex]] = [result[minIndex], result[i]];
        }
    }
    
    return result;
}

// 示例使用
const arr2 = [64, 34, 25, 12, 22, 11, 90];
console.log('原数组:', arr2);
console.log('选择排序结果:', selectionSort(arr2));

3. 插入排序 (Insertion Sort)

function insertionSort(arr) {
    const result = [...arr];
    
    for (let i = 1; i < result.length; i++) {
        const key = result[i];
        let j = i - 1;
        
        // 将大于key的元素向右移动
        while (j >= 0 && result[j] > key) {
            result[j + 1] = result[j];
            j--;
        }
        result[j + 1] = key;
    }
    
    return result;
}

// 示例使用
const arr3 = [64, 34, 25, 12, 22, 11, 90];
console.log('原数组:', arr3);
console.log('插入排序结果:', insertionSort(arr3));

4. 快速排序 (Quick Sort)

function quickSort(arr) {
    if (arr.length <= 1) {
        return arr;
    }
    
    const pivot = arr[Math.floor(arr.length / 2)];
    const left = [];
    const right = [];
    const equal = [];
    
    for (let element of arr) {
        if (element < pivot) {
            left.push(element);
        } else if (element > pivot) {
            right.push(element);
        } else {
            equal.push(element);
        }
    }
    
    return [...quickSort(left), ...equal, ...quickSort(right)];
}

// 原地快速排序版本
function quickSortInPlace(arr, low = 0, high = arr.length - 1) {
    if (low < high) {
        const pi = partition(arr, low, high);
        quickSortInPlace(arr, low, pi - 1);
        quickSortInPlace(arr, pi + 1, high);
    }
    return arr;
}

function partition(arr, low, high) {
    const pivot = arr[high];
    let i = low - 1;
    
    for (let j = low; j < high; j++) {
        if (arr[j] < pivot) {
            i++;
            [arr[i], arr[j]] = [arr[j], arr[i]];
        }
    }
    
    [arr[i + 1], arr[high]] = [arr[high], arr[i + 1]];
    return i + 1;
}

// 示例使用
const arr4 = [64, 34, 25, 12, 22, 11, 90];
console.log('原数组:', arr4);
console.log('快速排序结果:', quickSort([...arr4]));

5. 归并排序 (Merge Sort)

function mergeSort(arr) {
    if (arr.length <= 1) {
        return arr;
    }
    
    const mid = Math.floor(arr.length / 2);
    const left = mergeSort(arr.slice(0, mid));
    const right = mergeSort(arr.slice(mid));
    
    return merge(left, right);
}

function merge(left, right) {
    const result = [];
    let leftIndex = 0;
    let rightIndex = 0;
    
    // 合并两个已排序的数组
    while (leftIndex < left.length && rightIndex < right.length) {
        if (left[leftIndex] < right[rightIndex]) {
            result.push(left[leftIndex]);
            leftIndex++;
        } else {
            result.push(right[rightIndex]);
            rightIndex++;
        }
    }
    
    // 添加剩余元素
    return result.concat(left.slice(leftIndex)).concat(right.slice(rightIndex));
}

// 示例使用
const arr5 = [64, 34, 25, 12, 22, 11, 90];
console.log('原数组:', arr5);
console.log('归并排序结果:', mergeSort(arr5));

6. 堆排序 (Heap Sort)

function heapSort(arr) {
    const result = [...arr];
    const n = result.length;
    
    // 构建最大堆
    for (let i = Math.floor(n / 2) - 1; i >= 0; i--) {
        heapify(result, n, i);
    }
    
    // 逐个提取元素
    for (let i = n - 1; i > 0; i--) {
        [result[0], result[i]] = [result[i], result[0]]; // 将当前最大元素移到末尾
        heapify(result, i, 0); // 重新调整堆
    }
    
    return result;
}

function heapify(arr, n, i) {
    let largest = i;
    const left = 2 * i + 1;
    const right = 2 * i + 2;
    
    if (left < n && arr[left] > arr[largest]) {
        largest = left;
    }
    
    if (right < n && arr[right] > arr[largest]) {
        largest = right;
    }
    
    if (largest !== i) {
        [arr[i], arr[largest]] = [arr[largest], arr[i]];
        heapify(arr, n, largest);
    }
}

// 示例使用
const arr6 = [64, 34, 25, 12, 22, 11, 90];
console.log('原数组:', arr6);
console.log('堆排序结果:', heapSort(arr6));
手把手教你用STM32实现三相永磁同步电机FOC控制(附代码) 本文详细介绍了基于STM32的三相永磁同步电机(PMSM)FOC控制实现方法,涵盖硬件设计、软件架构、参数调试及完整代码解析。通过磁场定向控制(FOC)算法,实现高效精准的电机控制,适用于工业自动化、电动汽车等领域。文章还提供了硬件选型建议、电流采样方案对比及PID参数整定技巧,助力开发者快速掌握FOC控制技术。 阅读详情

相关推荐

FSL软件安装

FSL软件安装

huang_tianyuan的博客 2630

探索神奇的排序算法世界:Sorting Algorithms Visualizer

探索神奇的排序算法世界:Sorting Algorithms Visualizer 是一个交互式的在线工具,专为学习、理解和比较各种排序算法而设计。通过可视化的方式,它将复杂的算法过程转化为生动的动画,帮助开发者和学生更好地理解这些算法的工作原理。 技术分析 该项目基于Web技术构建,利用了以下几个核心技术: HTML5 & CSS3 - 提供了页面的基本结构和样式,确保在现代浏览器上的...

gitblog_00041的博客 523

银河麒麟V10系统grub崩溃急救指南:从光盘救援到完整恢复(附常见错误排查)

本文详细介绍了银河麒麟V10系统grub崩溃的急救方法,从使用安装光盘进入救援环境到完整恢复系统的全流程。针对不同损坏程度(轻度、中度、严重)提供了分级恢复策略,包括grub2-install和grub2-mkconfig等关键命令的使用,并附有常见错误排查表,帮助用户快速解决引导问题。

weixin_30955617的博客 483

JavaScript 排序算法(JavaScript sorting algorithms)

JavaScrip 排序算法(JavaScript Sorting Algorithms) 基础构造函数 以下几种排序算法做为方法放在构造函数里。 function ArrayList () { var array = []; // 交换位置 var swap = function (index1, index2) { var aux = arra

lx520aa的博客 332

DeepSeek 框架和技术栈分析

DeepSeek 诞生于对更高效、更强大的深度学习计算和模型训练的追求。随着深度学习模型的规模不断增大,如大型语言模型(LLMs)和复杂的视觉模型,传统的框架在处理这些大规模模型时面临着性能瓶颈和资源利用效率低下的问题。DeepSeek 旨在解决这些问题,通过优化框架设计和采用先进的技术栈,实现更高效的模型训练和推理,同时降低计算成本。

yournameplease的专栏 1512

告别Keil/IAR:在VSCode中用CMake+Clangd打造丝滑的STM32开发环境(附完整配置)

本文详细介绍了如何在VSCode中使用CMake和Clangd搭建高效的STM32开发环境,替代传统的Keil/IAR工具。通过完整的配置指南和快速开发技巧,帮助开发者实现轻量级、高度可定制的现代化开发流程,显著提升STM32项目的开发效率。

weixin_26843605的博客 164

javascript: Sorting Algorithms

【代码】javascript: Sorting Algorithms。

Geovin Du Dream Park 1051

MATLAB 2022b 用户专属:保姆级IPOPT求解器安装配置全流程(含OPTI工具箱)

本文为MATLAB 2022b用户提供IPOPT求解器的详细安装与配置指南,涵盖OPTI工具箱的适配安装、环境变量设置及常见问题解决方案。通过实战案例演示非线性优化问题的求解过程,帮助用户高效部署这一强大的优化工具,提升工程计算效率。

weixin_29092031的博客 405

从基础到精通:gh_mirrors/algorithms6/Algorithms中的排序算法全解析 [特殊字符]

欢迎来到算法学习的终极指南!今天我们将深入探讨**gh_mirrors/algorithms6/Algorithms**项目中丰富的排序算法实现。无论你是编程新手还是想要巩固算法基础的开发者,这篇文章都将为你提供完整的排序算法学习路径。**排序算法**是计算机科学的基础核心,掌握它们对于提升编程能力和面试表现都至关重要。 ## 📊 为什么排序算法如此重要? 排序是计算机科学中最基本、最常用的

gitblog_00508的博客 438

廉价却有效?ESD防护中的电容

摘要:在成本敏感型电子产品设计中,多层陶瓷电容(MLCC)可作为TVS二极管的替代方案用于静电放电(ESD)防护。其工作原理是通过电容充放电特性吸收静电能量,而非电压钳位。计算表明100nF/50V MLCC可有效缓冲8kV静电冲击,但存在吸收能量有限、无自恢复等局限。建议将MLCC作为一级缓冲措施,配合TVS等器件形成多级防护,并优先选择X7R材质、100nF容值、50V耐压的0402/0603封装MLCC。该方案在低速信号和电源引脚防护中具有显著成本优势,但不能完全替代专业ESD抑制器。

硬核科技 430

网络攻防——kali操作系统基本使用

主要介绍如何搭建kali虚拟机,然后介绍了一个简单的攻击方法,切记,网络恶意攻击属于违法行为

weixin_46560512的博客 2万+

JavaScript 排序算法图解(JavaScript sorting algorithms)

基础构造函数 以下几种排序算法做为方法放在构造函数里。 function ArrayList () { var array = []; // 交换位置 var swap = function (index1, index2) { var aux = array[index1]; array[index1] =...

weixin_33937778的博客 117

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

javascript: Sorting Algorithms

【代码】javascript: Sorting Algorithms。

Geovin Du Dream Park 946

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

gh_mirrors/sor/sorting-visualizer部署教程:本地搭建与在线访问全攻略

gh_mirrors/sor/sorting-visualizer是一款功能强大的算法可视化工具,能够帮助用户直观地理解排序算法和路径查找算法的工作原理。本教程将详细介绍如何在本地搭建该项目并实现在线访问,让你轻松掌握算法可视化的部署方法。 ## 准备工作:环境与工具要求 在开始部署gh_mirrors/sor/sorting-visualizer之前,需要确保你的系统满足以下环境要求: -

gitblog_01057的博客 703

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

探索gh_mirrors/algorithms6/Algorithms:一站式掌握数据结构与算法的终极指南

想要系统学习数据结构与算法却不知从何开始?gh_mirrors/algorithms6/Algorithms项目为你提供了一个完美的学习平台!这个开源项目包含了数百种经典算法和数据结构的多种编程语言实现,是程序员提升编程技能的终极资源库。无论你是编程新手还是经验丰富的开发者,都能在这里找到宝贵的学习材料。 ## 📚 为什么数据结构与算法如此重要? 数据结构与算法是计算机科学的核心基础,掌握它

gitblog_00850的博客 849

Folia PlayerCap 教程:OBS 浏览器源直出歌词动画,窗口捕获可以退场了

Folia 是主打歌词动画的跨平台播放器,本地曲库、Navidrome 和多家在线平台都能播。这篇 Folia PlayerCap 教程讲的是另一件事:让它以网页形态把逐词高亮的歌词舞台送进 OBS——**Nexus PlayerCap** 作为中间层监听 `localhost:8765`,Folia 连上它,OBS 端用浏览器源加载生成的链接。全程不用窗口捕获,也没有截图软件逐帧采集。 [![

gitblog_00802的博客 179

如何快速入门Algorithms算法库?新手必备的学习路径与资源

想要快速掌握数据结构与算法的核心概念吗?Algorithms算法库是一个包含多种编程语言实现的算法和数据结构开源项目,为学习者和开发者提供了绝佳的学习资源。无论你是编程新手还是有一定经验的开发者,这个项目都能帮助你快速理解算法原理和实现方法。 ## 🚀 为什么选择Algorithms算法库? Algorithms算法库是一个精心整理的算法实现集合,涵盖了从基础到高级的各种算法。它最大的优势在

gitblog_00458的博客 921

揭秘gh_mirrors/sor/sorting-visualizer的动画原理:如何实现流畅的排序过程展示?

gh_mirrors/sor/sorting-visualizer是一款强大的排序算法可视化工具,通过直观的动画效果帮助用户理解各种排序算法的工作原理。本文将深入剖析其动画实现机制,带你了解如何让抽象的排序过程变得生动可见。 ## 动画核心:关键帧与CSS变换 排序可视化的核心在于将算法的每一步操作转化为视觉变化。该项目采用CSS关键帧动画(Keyframes Animation)作为基础技术

gitblog_00047的博客 682

数组值如何变成声波?Visual Sorting的Web Audio声音引擎实现深度剖析

Visual Sorting(又名 The Sound Of Sorting)是一款排序算法可视化工具:它把数组中的每个值画成一根柱子,并让算法"碰"到的柱子发出对应音高——值越大,声音越尖。整副"声音魔法"其实只用了不到 50 行基于 Web Audio API 的代码,本文带你拆解这套声音引擎的完整实现原理。 [![Visual Sorting 排序算法可视化与声音引擎演示界面:彩色条形柱随

gitblog_00849的博客 881

排序算法(Sorting algorithm)(一)

写在前面: 本文章旨在总结备份、方便以后查询,由于是个人总结,如有不对,欢迎指正;另外,内容大部分来自网络、书籍、和各类手册,如若侵权请告知,马上删帖致歉。 来源: https://zh.wikipedia.org/wiki/%E6%8E%92%E5%BA%8F%E7%AE%97%E6%B3%95 https://github.com/hustcc/JS-Sorting-Algorithm https://www.cnblogs.com/sunshineliulu/category/11392.

夏沫的杂物间 1095

c: Sorting Algorithms

【代码】c: Sorting Algorithms。

Geovin Du Dream Park 483

ER-Save-Editor:用 Rust 写的艾尔登法环存档编辑器,改点数、加装备只需两分钟

ER-Save-Editor 是一个用 Rust 编写的艾尔登法环存档编辑器,同时支持 PC 的 .sl2 存档和 PS 平台经 Save Wizard 导出的 .txt 存档。它把改属性、加武器防具、修改卢恩、翻转 BOSS 击杀状态这些操作放进了一个可视化界面里,适合想快速搭测试 build、或者从误操作里捞回进度的人,不用再开十六进制编辑器手算偏移。 ## 它是怎么把二进制变成一组滑块的

gitblog_00151的博客 1259

提升算法学习效率的秘密武器:gh_mirrors/sor/sorting-visualizer高级技巧

gh_mirrors/sor/sorting-visualizer是一款基于React构建的响应式算法可视化工具,能够帮助学习者通过直观的视觉效果理解各种排序和路径查找算法的工作原理。本文将分享如何充分利用这个强大工具提升算法学习效率的高级技巧。 ## 快速入门:如何开始使用算法可视化工具 首先需要将项目克隆到本地环境: ```bash git clone https://gitcode.co

gitblog_00257的博客 372

10种编程语言实现!gh_mirrors/algorithms6/Algorithms中的经典算法对比终极指南 [特殊字符]

**算法和数据结构是计算机科学的核心**,而学习不同编程语言实现相同算法是提升编程能力的绝佳方式。gh_mirrors/algorithms6/Algorithms项目正是一个包含多种编程语言实现的算法和数据结构宝库,让你可以一次性对比10+种语言的实现差异!这个开源项目汇集了从基础排序算法到复杂数据结构的完整实现,是学习算法和编程语言特性的完美资源。 ## 📊 项目概览:多语言算法实现的宝库

gitblog_00051的博客 403

2.7.1 希尔排序及java实现

希尔排序(Shell Sort)是插入排序的一种高效改进版本,也称为。

橘子hhh 166
上一篇: 动态规划 (Dynamic Programming) 算法概念-Python示例
下一篇: 排序算法 (Sorting Algorithms)-Python示例
香蕉可乐荷包蛋
博客等级 码龄6年 1013粉丝 174原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

香蕉可乐荷包蛋

努力写有用的code

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值