首页 > 编程语言 >js实现归并排序算法

js实现归并排序算法

时间:2024-07-14 10:07:59浏览次数:17  
标签:mergeSort 归并 递归 js result 数组 排序

在 JavaScript 中实现归并排序可以通过递归的方式完成。归并排序使用了“分而治之”的策略,将数组递归地分成两个子数组,分别进行排序,然后将它们合并成一个有序数组。以下是一个简单的归并排序实现:

function mergeSort(arr) {
    // 如果数组只有一个元素或为空,则直接返回数组
    if (arr.length <= 1) {
        return arr;
    }

    // 找到数组的中间点
    const mid = Math.floor(arr.length / 2);

    // 将数组分成两部分
    const left = arr.slice(0, mid);
    const right = arr.slice(mid);

    // 递归地对左右两部分进行排序并合并
    return merge(mergeSort(left), mergeSort(right));
}

function merge(left, right) {
    const result = [];
    let i = 0;
    let j = 0;

    // 合并两个有序数组
    while (i < left.length && j < right.length) {
        if (left[i] < right[j]) {
            result.push(left[i]);
            i++;
        } else {
            result.push(right[j]);
            j++;
        }
    }

    // 将剩余的元素添加到结果中
    return result.concat(left.slice(i)).concat(right.slice(j));
}

// 示例使用
const unsortedArray = [3, 6, 8, 10, 1, 2, 1];
const sortedArray = mergeSort(unsortedArray);
console.log(sortedArray);

代码解释

  1. mergeSort 函数

    • 如果数组的长度小于等于1,直接返回数组,因为这种情况下不需要排序。
    • 找到数组的中间点 mid,将数组分成两部分:左部分 left 和右部分 right
    • 递归调用 mergeSort 对左右两部分进行排序,然后调用 merge 函数将两部分合并。
  2. merge 函数

    • 初始化一个空数组 result 来存储合并后的结果。
    • 使用两个指针 ij 分别遍历 leftright 数组。
    • 比较 leftright 中的元素,将较小的元素添加到 result 中,指针相应地移动。
    • 将剩余的元素(如果有)添加到 result 中。

示例

const unsortedArray = [3, 6, 8, 10, 1, 2, 1];
const sortedArray = mergeSort(unsortedArray);
console.log(sortedArray); // 输出: [1, 1, 2, 3, 6, 8, 10]

这个实现展示了如何使用递归和合并步骤来完成归并排序。归并排序的时间复杂度始终为 (O(n \log n)),并且是稳定排序,适用于需要保持相同元素相对顺序的场景。

标签:mergeSort,归并,递归,js,result,数组,排序
From: https://www.cnblogs.com/jocongmin/p/18301132

相关文章

  • js实现快速排序算法
    在JavaScript中实现快速排序可以通过递归方式来完成。下面是一个示例代码:functionquickSort(arr){//如果数组为空或只有一个元素,则无需排序if(arr.length<=1){returnarr;}//选择基准元素(这里选择中间元素)constpivotIndex=Math.fl......
  • 基于非支配排序遗传算法NSGAII的综合能源优化调度(Matlab代码实现)
    ......
  • 【反悔贪心】P2949WorkSchedulingG+P4053[JSOI2007]建筑抢修题解
    这两天遇到了几个很神奇的题目——能反悔的贪心。赶紧记录一下。例1(用时一定模型)用时一定:每个任务完成的耗时都是一样的。题面:Luogu-P2949WorkSchedulingG大体思路是:先把所有任务按照截止时间从小到大排序,然后枚举,遇到一个能做任务的就把他做了,把他的贡献加入一个......
  • three.js+vue污水处理厂数字孪生平台智慧城市web3d
    案例效果截图如下: 主场景三维逻辑代码如下:<template><divclass="whole"><!--threejs画布--><divid="threejs"ref="threejs"></div><!--污水厂模型加载进度条--><a-progress:stroke-colo......
  • 82. 删除排序链表中的重复元素 II
    82.删除排序链表中的重复元素II是一个有序链表错误代码classSolution{publicListNodedeleteDuplicates(ListNodehead){ListNodedummy=newListNode();dummy.next=head;while(head!=null&&head.next!=null){i......
  • java数组之冒泡排序、快速排序
    一、排序算法概述1.算法定义排序:假设含有n个记录的序列为{R1,R2,...,Rn},其相应的关键字序列为{K1,K2,...,Kn}。将这些记录重新排序为{Ri1,Ri2,...,Rin},使得相应的关键字值满足条Ki1<=Ki2<=...<=Kin,这样的一种操作称为排序。通常来说,排序的目的是快速查找。2.衡量排序算......
  • 希尔排序--插入排序升级版
    #include<stdio.h>//希尔排序函数voidshellSort(intarr[],intsize){inti,j,gap,temp;//计算初始增量gap=1;while(gap<size){gap=gap*3+1;//Knuth增量序列for(i=gap;i<size;i++){//当前待插......
  • 048基于SSM+Jsp的教学质量评价系统
     开发语言:Java框架:ssm技术:JSPJDK版本:JDK1.8服务器:tomcat7数据库:mysql5.7(一定要5.7版本)数据库工具:Navicat11开发软件:eclipse/myeclipse/ideaMaven包:Maven3.3.9系统展示管理员登录管理员功能学院管理学生管理教师管理督导管理教师信息管理学生评教管理督导评......
  • IO输入输出流例子:Java对象输出json文本:
    读取文件:原始字节输入流(低级):publicclassCharCacheIOReader{publicstaticvoidmain(String[]args){try(//原始字节输入流(低级)Readerfr=newFileReader("src\\OutputStream.txt");//创建一个字......
  • js 实现二分搜索算法
    二分算法搜索数字二分搜索算法是一种在有序数组中查找目标值的高效方法。其时间复杂度为(O(\logn))。下面是用JavaScript实现的二分搜索算法:functionbinarySearch(arr,target){letleft=0;letright=arr.length-1;while(left<=right){......