찾다
웹 프론트엔드JS 튜토리얼JavaScript 알고리즘 병합 정렬 알고리즘(자세한 설명)

JavaScript 알고리즘 병합 정렬 알고리즘(자세한 설명)

이 기사에서는 병합 정렬의 논리를 배우고 이를 JavaScript로 구현합니다. 마지막으로 병합 정렬은 공간 및 시간 복잡도 측면에서 다른 알고리즘과 비교됩니다.

병합 정렬의 논리

병합 정렬은 분할 및 정복 개념을 사용하여 주어진 요소 목록을 정렬합니다. 문제가 직접 해결될 수 있을 만큼 단순해질 때까지 문제를 더 작은 하위 문제로 나눕니다.

다음은 병합 정렬 단계입니다.

1. 주어진 목록을 두 부분으로 나눕니다(목록의 요소 수가 홀수인 경우 대략 동일하게 만듭니다).

2. 단일 요소 배열만 남을 때까지 동일한 방식으로 하위 배열을 계속 나눕니다.

3. 단일 요소 배열에서 시작하여 병합된 각 하위 배열을 정렬하기 위해 하위 배열을 merge합니다.

4. 최종적으로 정렬된 배열을 얻을 때까지 3단계를 반복하세요.

[4, 8, 7, 2, 11, 1, 3] 배열을 예로 들어 병합 정렬이 어떻게 작동하는지 살펴보겠습니다. [4, 8, 7, 2, 11, 1, 3] 为例,让我们看一下归并排序是如何工作的:

JavaScript 알고리즘 병합 정렬 알고리즘(자세한 설명)

用 JavaScript 实现归并排序

首先实现一个将两个已排序子数组合并为一个已排序数组的函数 merge() 。要注意着两个子数组是已经被排好序的,这一点非常重要, merge() 函数只用于其进行合并。【推荐教程:《JavaScript视频教程》】

可以通过遍历这两个子数组来实现:

function merge(left, right) {
    let arr = []
    // 如果任何一个数组为空,就退出循环
    while (left.length && right.length) {
        // 从左右子数组的最小元素中选择较小的元素
        if (left[0] < right[0]) {
            arr.push(left.shift())  
        } else {
            arr.push(right.shift()) 
        }
    }
    
    // 连接剩余的元素,防止没有把两个数组遍历完整
    return [ ...arr, ...left, ...right ]
}

在这个函数中,通过把两个排好序的子数组(leftright)合并来获得一个排好序的大数组。首先,创建一个空数组。之后在 leftright 两个子数组中最小元素中的较小的一个,并将其添加到空数组。我们只需要检查 leftright 子数组中的第一个元素,因为它们是已排好序的。

在这个过程中,从子数组中删除了被选择的元素(通过 shift()  函数实现)。继续这个过程,直到其中一个子数组变为空。最后把非空子数组的剩余元素(因为它们已经被排序)插入主数组的最后面。

现在有了合并两个已排序数组的代码,接下来为实现归并排序算法的最终代码。这意味着要继续分割数组,直到最终只包含一个元素的数组为止:

function mergeSort(array) {
  const half = array.length / 2
  
  if(array.length < 2){
    return array 
  }
  
  const left = array.splice(0, half)
  return merge(mergeSort(left),mergeSort(array))
}

在代码中先确定中点,并用 splice() 函数将数组分为两个子数组。如果元素数量为奇数,则左侧的元素数量会少一个。不断的划分数组,直到剩下单个元素的数组(array.length )。然后用之前实现的 <code>merge()

JavaScript 알고리즘 병합 정렬 알고리즘(자세한 설명)

JavaScript를 사용하여 병합 정렬 구현

먼저 함수 구현 두 개의 정렬된 하위 배열을 하나의 정렬된 배열로 병합하는 merge() 두 하위 배열은 이미 정렬되어 있으며 merge() 함수는 이를 병합하는 데만 사용된다는 점에 유의하는 것이 중요합니다. [추천 튜토리얼: "JavaScript 비디오 튜토리얼

"]

이 두 하위 배열을 탐색할 수 있습니다 구현:

array = [4, 8, 7, 2, 11, 1, 3];
console.log(mergeSort(array));

이 함수에서는 두 개의 정렬된 하위 배열(left, right)을 병합하여 큰 정렬 배열을 얻습니다. 먼저, 빈 배열을 만듭니다. 그런 다음 두 하위 배열 leftright에서 가장 작은 요소 중 더 작은 요소를 가져와 빈 배열에 추가합니다. 왼쪽오른쪽 하위 배열은 이미 정렬되어 있으므로 첫 번째 요소만 확인하면 됩니다. 이 과정에서 선택한 요소가 하위 배열에서 삭제됩니다(shift() 함수로 구현됨). 하위 배열 중 하나가 비어 있을 때까지 이 프로세스를 계속합니다. 마지막으로 비어 있지 않은 하위 배열의 나머지 요소(정렬되었으므로)를 기본 배열의 끝에 삽입합니다.

이제 두 개의 정렬된 배열을 병합하는 코드가 있으므로 병합 정렬 알고리즘을 구현하는 최종 코드는 다음과 같습니다. 이는 요소가 하나만 포함된 배열이 될 때까지 배열을 계속 분할한다는 의미입니다.

1,2,3,4,7,8,11

코드에서 먼저 중간점을 결정하고 splice() 함수를 사용하여 배열을 두 개의 하위 배열로 분할합니다. . 요소 개수가 홀수이면 왼쪽 요소 개수가 1개 줄어듭니다. 단일 요소의 배열이 남을 때까지(array.length ) 배열을 계속 나눕니다. 그런 다음 앞서 구현한 <code>merge() 함수를 사용하여 하위 배열을 병합합니다.

코드가 구현된 후 이전 사용 사례로 테스트하세요.

rrreee

출력은 예상과 일치합니다. rrreee병합 정렬의 효율성

🎜병합 정렬의 최악의 시간 복잡도는 $O(n\log n)$, 이는 퀵 정렬과 동일 최적의 경우 시간 복잡도는 동일합니다. 병합 정렬은 현재 사용 가능한 가장 빠른 정렬 알고리즘 중 하나입니다. 🎜🎜빠른 정렬과 달리 병합 정렬은 🎜in-place🎜 정렬 알고리즘이 아니므로 입력 배열 외에 추가 공간을 차지합니다. 이는 하위 배열을 저장하기 위해 보조 배열을 사용하기 때문입니다. 병합 정렬의 공간 복잡도는 $O(n)$입니다. 🎜🎜병합 정렬의 또 다른 장점은 분할된 각 절반을 독립적으로 정렬할 수 있기 때문에 멀티스레딩에 매우 적합하다는 것입니다. 병합 정렬의 실행 시간을 줄이는 또 다른 일반적인 방법은 상대적으로 작은 하위 배열(약 7개 요소)에 도달할 때 삽입 정렬을 사용하는 것입니다. 삽입 정렬은 작거나 거의 정렬된 배열에서 매우 잘 작동하기 때문입니다. 🎜🎜Summary🎜🎜이 기사에서는 병합 정렬 알고리즘의 논리에 대해 알아보고 이를 JavaScript로 구현했습니다. 이는 기본 정렬 알고리즘 중 하나이며 분할 정복 전략을 더 잘 이해하는 데 도움이 될 수 있습니다. 🎜🎜더 많은 프로그래밍 관련 지식을 보려면 🎜프로그래밍 비디오 코스🎜를 방문하세요! ! 🎜

위 내용은 JavaScript 알고리즘 병합 정렬 알고리즘(자세한 설명)의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명
이 기사는 segmentfault에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제
es6数组怎么去掉重复并且重新排序es6数组怎么去掉重复并且重新排序May 05, 2022 pm 07:08 PM

去掉重复并排序的方法:1、使用“Array.from(new Set(arr))”或者“[…new Set(arr)]”语句,去掉数组中的重复元素,返回去重后的新数组;2、利用sort()对去重数组进行排序,语法“去重数组.sort()”。

JavaScript的Symbol类型、隐藏属性及全局注册表详解JavaScript的Symbol类型、隐藏属性及全局注册表详解Jun 02, 2022 am 11:50 AM

本篇文章给大家带来了关于JavaScript的相关知识,其中主要介绍了关于Symbol类型、隐藏属性及全局注册表的相关问题,包括了Symbol类型的描述、Symbol不会隐式转字符串等问题,下面一起来看一下,希望对大家有帮助。

原来利用纯CSS也能实现文字轮播与图片轮播!原来利用纯CSS也能实现文字轮播与图片轮播!Jun 10, 2022 pm 01:00 PM

怎么制作文字轮播与图片轮播?大家第一想到的是不是利用js,其实利用纯CSS也能实现文字轮播与图片轮播,下面来看看实现方法,希望对大家有所帮助!

JavaScript对象的构造函数和new操作符(实例详解)JavaScript对象的构造函数和new操作符(实例详解)May 10, 2022 pm 06:16 PM

本篇文章给大家带来了关于JavaScript的相关知识,其中主要介绍了关于对象的构造函数和new操作符,构造函数是所有对象的成员方法中,最早被调用的那个,下面一起来看一下吧,希望对大家有帮助。

JavaScript面向对象详细解析之属性描述符JavaScript面向对象详细解析之属性描述符May 27, 2022 pm 05:29 PM

本篇文章给大家带来了关于JavaScript的相关知识,其中主要介绍了关于面向对象的相关问题,包括了属性描述符、数据描述符、存取描述符等等内容,下面一起来看一下,希望对大家有帮助。

javascript怎么移除元素点击事件javascript怎么移除元素点击事件Apr 11, 2022 pm 04:51 PM

方法:1、利用“点击元素对象.unbind("click");”方法,该方法可以移除被选元素的事件处理程序;2、利用“点击元素对象.off("click");”方法,该方法可以移除通过on()方法添加的事件处理程序。

整理总结JavaScript常见的BOM操作整理总结JavaScript常见的BOM操作Jun 01, 2022 am 11:43 AM

本篇文章给大家带来了关于JavaScript的相关知识,其中主要介绍了关于BOM操作的相关问题,包括了window对象的常见事件、JavaScript执行机制等等相关内容,下面一起来看一下,希望对大家有帮助。

20+道必知必会的Vue面试题(附答案解析)20+道必知必会的Vue面试题(附答案解析)Apr 06, 2021 am 09:41 AM

本篇文章整理了20+Vue面试题分享给大家,同时附上答案解析。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。

See all articles

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

AI Hentai Generator

AI Hentai Generator

AI Hentai를 무료로 생성하십시오.

뜨거운 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)

Eclipse용 SAP NetWeaver 서버 어댑터

Eclipse용 SAP NetWeaver 서버 어댑터

Eclipse를 SAP NetWeaver 애플리케이션 서버와 통합합니다.

Atom Editor Mac 버전 다운로드

Atom Editor Mac 버전 다운로드

가장 인기 있는 오픈 소스 편집기

mPDF

mPDF

mPDF는 UTF-8로 인코딩된 HTML에서 PDF 파일을 생성할 수 있는 PHP 라이브러리입니다. 원저자인 Ian Back은 자신의 웹 사이트에서 "즉시" PDF 파일을 출력하고 다양한 언어를 처리하기 위해 mPDF를 작성했습니다. HTML2FPDF와 같은 원본 스크립트보다 유니코드 글꼴을 사용할 때 속도가 느리고 더 큰 파일을 생성하지만 CSS 스타일 등을 지원하고 많은 개선 사항이 있습니다. RTL(아랍어, 히브리어), CJK(중국어, 일본어, 한국어)를 포함한 거의 모든 언어를 지원합니다. 중첩된 블록 수준 요소(예: P, DIV)를 지원합니다.

SecList

SecList

SecLists는 최고의 보안 테스터의 동반자입니다. 보안 평가 시 자주 사용되는 다양한 유형의 목록을 한 곳에 모아 놓은 것입니다. SecLists는 보안 테스터에게 필요할 수 있는 모든 목록을 편리하게 제공하여 보안 테스트를 더욱 효율적이고 생산적으로 만드는 데 도움이 됩니다. 목록 유형에는 사용자 이름, 비밀번호, URL, 퍼징 페이로드, 민감한 데이터 패턴, 웹 셸 등이 포함됩니다. 테스터는 이 저장소를 새로운 테스트 시스템으로 간단히 가져올 수 있으며 필요한 모든 유형의 목록에 액세스할 수 있습니다.