이 기사에서는 병합 정렬의 논리를 배우고 이를 JavaScript로 구현합니다. 마지막으로 병합 정렬은 공간 및 시간 복잡도 측면에서 다른 알고리즘과 비교됩니다.
병합 정렬의 논리
병합 정렬은 분할 및 정복 개념을 사용하여 주어진 요소 목록을 정렬합니다. 문제가 직접 해결될 수 있을 만큼 단순해질 때까지 문제를 더 작은 하위 문제로 나눕니다.
다음은 병합 정렬 단계입니다.
1. 주어진 목록을 두 부분으로 나눕니다(목록의 요소 수가 홀수인 경우 대략 동일하게 만듭니다).
2. 단일 요소 배열만 남을 때까지 동일한 방식으로 하위 배열을 계속 나눕니다.
3. 단일 요소 배열에서 시작하여 병합된 각 하위 배열을 정렬하기 위해 하위 배열을 merge합니다.
4. 최종적으로 정렬된 배열을 얻을 때까지 3단계를 반복하세요.
[4, 8, 7, 2, 11, 1, 3]
배열을 예로 들어 병합 정렬이 어떻게 작동하는지 살펴보겠습니다. [4, 8, 7, 2, 11, 1, 3]
为例,让我们看一下归并排序是如何工作的:
用 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 ] }
在这个函数中,通过把两个排好序的子数组(left
、right
)合并来获得一个排好序的大数组。首先,创建一个空数组。之后在 left
和 right
两个子数组中最小元素中的较小的一个,并将其添加到空数组。我们只需要检查 left
和 right
子数组中的第一个元素,因为它们是已排好序的。
在这个过程中,从子数组中删除了被选择的元素(通过 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()

merge()
두 하위 배열은 이미 정렬되어 있으며 merge()
함수는 이를 병합하는 데만 사용된다는 점에 유의하는 것이 중요합니다. [추천 튜토리얼: "JavaScript 비디오 튜토리얼"]
이 두 하위 배열을 탐색할 수 있습니다 구현:
array = [4, 8, 7, 2, 11, 1, 3]; console.log(mergeSort(array));
이 함수에서는 두 개의 정렬된 하위 배열(left
, right
)을 병합하여 큰 정렬 배열을 얻습니다. 먼저, 빈 배열을 만듭니다. 그런 다음 두 하위 배열 left
및 right
에서 가장 작은 요소 중 더 작은 요소를 가져와 빈 배열에 추가합니다. 왼쪽
및 오른쪽
하위 배열은 이미 정렬되어 있으므로 첫 번째 요소만 확인하면 됩니다. 이 과정에서 선택한 요소가 하위 배열에서 삭제됩니다(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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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

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

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

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

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

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

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

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


핫 AI 도구

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

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

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

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

인기 기사

뜨거운 도구

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

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

Atom Editor Mac 버전 다운로드
가장 인기 있는 오픈 소스 편집기

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

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