首页 > 其他分享 >归并排序思想

归并排序思想

时间:2023-09-27 18:11:07浏览次数:34  
标签:归并 思想 process arr mid merge 数组 排序

前言

最近在学习算法, 不得不说, 怪难来, 不过, 也很妙, 感觉这些知识太难了, 学会了, 还容易忘, 我觉定记录一下, 争取用最清晰,最简单的语言来描述我学习到的思想

归并排序

这个排序的思想大概是, 利用递归分治思想, 实现排序的过程, 大致过程是先把数组分割成不可分割单位, 打比方 [3,1,4,2,6,5]这个数组, 先分成独立的每个数, 然后合并, 在合并的过程中排序.
宏观理解成 把数组看成两半, 左边排好序, 右边排好序, 然后有一个merge过程让整体有序

merge过程是用两个指针, 一个指向左边数组的开头, 一个指向右边数组的开头
谁小复制谁, 从头复制到尾, 就排好序了

实现

function mergeSort(arr) {
    if (!arr || arr.length < 2) {
        return
    }
    
    process(arr, 0, arr.length - 1)
}

function process(arr, l, r) {
    if (l == r) {
        return
    }
    let mid = Math.floor((l + r) / 2)
    process(arr, l, mid)
    process(arr, mid + 1, r) 
    merge(arr, l, mid, r)
}

function merge(arr, l, m, r) {
    let help = Array(r - l + 1),
        i = 0,
        p1 = l,
        p2 = m + 1
    while (p1 <= m && p2 <= r) {
        help[i++] = arr[p1] <= arr[p2] ? arr[p1++] : arr[p2++]
    }
    
    while (p1 <= m) {
        help[i++] = arr[p1++]
    }
    while (p2 <= r) {
        help[i++] = arr[p2++]
    }
    
    for (i = 0; i < help.length; i++) {
        arr[l + i] = help[i]
    }
}

function test() {
    let arr = [9, 8, 7, 6, 5, 4, 3, 2, 1]
    console.log("before sort", arr)
    mergeSort(arr)
    console.log("after sort", arr)
}
test()

图解

标签:归并,思想,process,arr,mid,merge,数组,排序
From: https://www.cnblogs.com/kelanmonkperson/p/17733355.html

相关文章

  • 【从0学习Solidity】 10. 控制流,用solidity实现插入排序
    【从0学习Solidity】10.控制流,用solidity实现插入排序博主简介:不写代码没饭吃,一名全栈领域的创作者,专注于研究互联网产品的解决方案和技术。熟悉云原生、微服务架构,分享一些项目实战经验以及前沿技术的见解。关注我们的主页,探索全栈开发,期待与您一起在移动开发的世界中,不断进步和......
  • 一文读懂倒排序索引涉及的核心概念
    基础概念相信对于第一次接触Elasticsearch的同学来说,最难理解的概念就是倒排序索引(也叫反向索引),因为这个概念跟我们之前在传统关系型数据库中的索引概念是完全不同的!在这里我就重点给大家介绍一下倒排序索引,这个概念搞明白之后,然后学习Elasticsearch就会清晰很多了。正向索引和......
  • 算法思想
    贪心算法(GreedyAlgorithm):贪心算法是一种每步都选择当前状态下最优解的方法,希望最终可以得到全局最优解。它通常用于优化问题,如最小生成树、最短路径等。分治法(DivideandConquer):分治法将大问题分割成小问题,解决小问题,然后将它们合并以获得原始问题的解决方案。典型的例......
  • 合并K个排序链表
    合并K个排序链表描述合并 k 个排序链表,返回合并后的排序链表。请分析和描述算法的复杂度。示例:输入:[ 1->4->5, 1->3->4, 2->6]输出:1->1->2->3->4->4->5->6题解使用heapq,但是ListNode没有比较函数,所以需要自行定义:ListNode.__lt__=lambdax,y:x.val<......
  • 整洁架构在前端的设计思想与应用实践
    随着业务的发展,前端项目承载了越来越多的职责,也越来越复杂,简单通过cli生成的框架结构越来越无法满足。面对前端项目复杂度的不断提升,我们开始思考前端的架构组织方式怎么才更合理?应该如何设计良好的前端架构?行业是否有比较好的优秀实践?本文先从架构基本概念开始介绍,然后介......
  • 《Java编程思想第四版》学习笔记31--关于Externalizable
    //:Blip3.java//Reconstructinganexternalizableobjectimportjava.io.*;importjava.util.*;classBlip3implementsExternalizable{inti;Strings;//NoinitializationpublicBlip3(){System.out.println("Blip3Constructor");//s,inoti......
  • drf(过滤、排序、异常)
    一.过滤组件1内置过滤组件SearchFilter#缺点:外键字段的搜索操作将会抛出异常:RelatedFieldgotinvalidlookup:icontains#1)在视图文件views.py中导入drf的搜索组件fromrest_framework.filtersimportSearchFilter#2)将搜索组件配置给群查接口视图类的filter_b......
  • 数据库中order by 依照指定顺序排序如何操作
    SQL学习之使用orderby依照指定顺序排序或自己定义顺序排序 我们通常须要依据客户需求对于查询出来的结果给客户提供自己定义的排序方式,那么我们通常sql须要实现方式都有哪些,參考很多其它资料总结例如以下:一、假设我们仅仅是对于在某个程序中的应用是须要依照例如以下的方......
  • 24、Go语言中的OOP思想
    1、是什么?OOP:面向对象Go语言的解构体嵌套 1、模拟集成性:is-a typeAstruct{ field } typeBstruct{ A//匿名字段 } 这种方式就会存在变量提升 2、模拟聚合关系:has-a typeCstruct{ field } typeDstruct{ cC//聚合关系 } 这种......
  • 排序
    排序算法哪些是稳定的排序算法,哪些是不稳定的稳定的:直接插入排序:最坏情况是逆序,时间复杂度是O(N2),最好情况是插入的都是顺序,时间复杂度O(N),空间复杂度O(1)冒泡排序:时间复杂度O(N2),空间复杂度O(1)计数排序:时间复杂度O(N+Range),空间复杂度O(range)不稳定:希尔排序:时间复杂度O(N......