정렬 알고리즘 - 병합 정렬 [코드 포함]
병합 정렬이란 무엇인가요?
간단히 말해서 병합 정렬은 순서가 지정된 두 시퀀스를 통합하는 것입니다.
추천 튜토리얼: PHP 비디오 튜토리얼
두 개의 정렬된 시퀀스를 어떻게 통합하나요?
그러면 이제 M={m1,m2,m3,...,mx} 시퀀스와 N={n1,n2,n3,...,ny} 시퀀스가 있다고 가정합니다. 이미 순서가 지정된 시퀀스입니다. 먼저 빈 시퀀스 K = {}를 만든 다음 m1과 n1을 비교하고 m1
병합 정렬은 정렬된 시퀀스를 통합하므로 정렬되지 않은 시퀀스는 정렬할 수 없다는 뜻 아닌가요?
병합 정렬은 분할 정복 방법을 기반으로 합니다. 즉, 완전히 무질서한 시퀀스를 무선으로 분할하여 정렬된 시퀀스를 얻을 수 있습니다. 예: 이제 M={m1, m2, m3 ,... .,mx}, M 시퀀스는 완전히 무질서한 시퀀스입니다. 그러면 M 시퀀스는 여러 개의 작은 시퀀스({m1, m2}, {m3, m4}....{mx- 1, mx})로 나눌 수 있습니다. 이번에는 이러한 시퀀스가 순서대로 정렬되어 있어 병합 작업을 통해 정렬할 수 있습니다. 따라서 병합 정렬은 정렬되지 않은 시퀀스도 정렬할 수 있으며 속도는 안정적인 정렬인 퀵 정렬에 이어 두 번째입니다.
시퀀스를 분할하는 방법은 무엇입니까?
이전 질문이 언급되었습니다. 병합 정렬은 분할 및 정복의 구현이 분할 순서에 반영됩니다. 이제 M={m1, m2, m3, .. .., mx}, 첫 번째 나눗셈: M1 = {m1, m2,..., m(x+1)/2}, M2 = {m(x+1)/2 +1, m( x+1 )/2 +2,...,mx}, 첫 번째 분할 후 M1 및 M2 시퀀스를 얻은 다음 M1 및 M2를 여러 번 분할한 후 x/2 + x%2 시퀀스를 얻습니다. , 그런 다음 병합 작업을 하나씩 수행합니다.
이 알고리즘의 특정 단계:
1. 첫 번째 포인터 왼쪽과 중간을 지정합니다(왼쪽은 시퀀스 1의 첫 번째 요소를 가리키고 오른쪽은 시퀀스 2의 첫 번째 요소를 가리킵니다)
2. 비교 왼쪽과 중간의 크기, 작은 요소를 새 공간에 넣습니다
3. 시퀀스 중 하나가 탐색될 때까지 2단계를 반복합니다
4. 추가되지 않은 나머지 요소를 새 공간에 직접 복사하여 붙여넣습니다. 새로운 공간으로
이 알고리즘 핵심 단계:
1. 분할 정복 방법(재귀)을 사용하여 시퀀스를 분할합니다.
2. 왼쪽과 중간의 크기를 비교하고 작은 추가
설명 뒤에 코드를 붙여넣습니다:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace 排序__归并排序 { class 归并 { public static int[] arr = { 6, 202, 301, 100, 38, 8, 1 ,-1,1000}; static void Main(string[] args) { Sort(arr, 0, arr.Length -1); foreach (var item in arr) { Console.Write(item + " "); } Console.ReadKey(); } public static void Sort(int []a,int left,int right) { if (left >= right) return; else { int mid = (left + right) / 2; //@1 Sort(a, left, mid); Sort(a, mid + 1, right); MergeSort(a, left, mid, right); } } public static void MergeSort(int []a,int left,int mid,int right) { int[] Arr = new int[right - left + 1]; int l = left, m = mid +1 , k = 0; //@2 while ( m <= right && l <= mid ) //@3 { if (a[l] > a[m]) Arr[k++] = a[m++]; else Arr[k++] = a[l++]; } while (m < right +1) //@4 { Arr[k++] = a[m++]; } while (l < mid +1 ) Arr[k++] = a[l++]; //@4 for (k = 0, l = left; l < right + 1; k++, l++) a[l] = Arr[k]; } } }
코드 해석:
@1: Sort() 함수는 요소의 분할을 완료합니다. 각 재귀는 시퀀스를 분리할 수 없을 때까지 두 부분으로 나눕니다.
@2: l은 시퀀스 1의 첫 번째 요소를 나타내고, m은 시퀀스 2의 첫 번째 요소를 나타내며, k는 새 배열의 기존 요소 수를 나타냅니다. Arr
@3: 시퀀스 1의 첫 번째 요소를 첫 번째 요소와 비교합니다. 시퀀스 2의 요소, 작은 요소를 Arr에 넣고 시퀀스 중 하나의 요소가 비교될 때까지 시퀀스 커서를 뒤로 이동합니다. @4: 시퀀스 1과 시퀀스 2 간의 비교 프로세스 중에 시퀀스 1에 다음이 있는 것처럼 보일 수 있습니다. 모두 Arr 에 추가되었지만 시퀀스 2가 아직 없으면 비교되지 않은 나머지 요소를 Arr
요약: 에 직접 복사하세요. 위의 코드는 실제 의미에서 배열을 분할하지 않습니다. 단지 논리적 분할을 수행하는 것뿐입니다. 다른 코드처럼 분할된 배열을 새 배열로 채우지는 않지만 속도와 메모리에는 약간의 영향이 있습니다. 이지만 결국 그렇게 좋지는 않습니다. 병합 작업에서 매개변수가 경계를 넘지 않도록 주의해야 합니다. (@2 위의 m이 왜 mid +1과 같아야 하는지 오랫동안 생각했습니다. 사실 이유는 매우 간단합니다. mid는 왼쪽 시퀀스에 속하고, mid+1부터 오른쪽 시퀀스에만 속하기 때문입니다. m = mid +1을 m =으로 변경하는 것은 불가능하지 않습니다. mid인데 후속 코드도 바꿔야 하는데 쓸데없는 비교를 하나 더 할 필요가 없군요. 당시에는 이 문제에 대해 정말 오랫동안 고민하고 있었습니다....) 사실, 논리적 관계가 명확하면 코드를 쉽게 파악할 수 있습니다.
위 내용은 정렬 알고리즘 - 병합 정렬 [코드 포함]의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

핫 AI 도구

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

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

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

Clothoff.io
AI 옷 제거제

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

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

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

뜨거운 주제











1. 문제의 배경 1. 양면시장 실험의 소개 양면시장, 즉 플랫폼은 생산자와 소비자라는 두 명의 참여자를 포함하며, 양측은 서로를 홍보한다. 예를 들어 Kuaishou에는 영상 제작자와 영상 소비자가 있는데, 그 두 아이덴티티는 어느 정도 겹칠 수 있습니다. 쌍방향 실험은 생산자 측과 소비자 측의 그룹을 결합하는 실험 방법입니다. 양자간 실험에는 다음과 같은 장점이 있습니다. (1) 제품 DAU의 변화, 작품을 업로드하는 사람 수 등 두 가지 측면에 대한 새로운 전략의 영향을 동시에 감지할 수 있습니다. 양자간 플랫폼은 종종 교차 네트워크 효과를 갖습니다. 독자가 많을수록 저자는 더 활발해지며, 저자가 더 활동적일수록 더 많은 독자가 팔로우하게 됩니다. (2) 효과 오버플로 및 전송을 감지할 수 있습니다. (3) 작용 메커니즘을 더 잘 이해하도록 도와주세요. AB 실험 자체는 원인과 결과 사이의 관계를 알려줄 수는 없습니다.

Vue 기술 개발에서 데이터 필터링 및 정렬 방법 Vue 기술 개발에서 데이터 필터링 및 정렬은 매우 일반적이고 중요한 기능입니다. 데이터 필터링 및 정렬을 통해 필요한 정보를 신속하게 쿼리하고 표시할 수 있어 사용자 경험이 향상됩니다. 이 기사에서는 Vue에서 데이터를 필터링하고 정렬하는 방법을 소개하고 독자가 이러한 기능을 더 잘 이해하고 사용할 수 있도록 구체적인 코드 예제를 제공합니다. 1. 데이터 필터링 데이터 필터링이란 특정 조건에 따라 요구 사항을 충족하는 데이터를 필터링하는 것을 의미합니다. Vue에서는 comp를 전달할 수 있습니다.

정렬 | Nuka-Cola, Chu Xingjuan 기본 컴퓨터 과학 과정을 수강한 친구들은 정렬 알고리즘을 직접 설계했을 것입니다. 즉, 코드를 사용하여 정렬되지 않은 목록의 항목을 오름차순 또는 내림차순으로 재정렬하는 것입니다. 이는 흥미로운 도전이며 이를 수행할 수 있는 방법은 많습니다. 정렬 작업을 보다 효율적으로 수행하는 방법을 찾는 데 많은 시간이 투자되었습니다. 기본 작업으로 정렬 알고리즘은 대부분의 프로그래밍 언어의 표준 라이브러리에 내장되어 있습니다. 대량의 데이터를 온라인으로 정리하기 위해 전 세계의 코드베이스에는 다양한 정렬 기술과 알고리즘이 사용되지만 적어도 LLVM 컴파일러와 함께 사용되는 C++ 라이브러리에 관한 한 정렬 코드는 10년 넘게 변경되지 않았습니다. . 최근 Google DeepMindAI 팀은

Swoole은 PHP 언어를 기반으로 하는 고성능 네트워크 통신 프레임워크로 다중 비동기 IO 모드와 다중 고급 네트워크 프로토콜의 구현을 지원합니다. Swoole을 기반으로 멀티 스레딩 기능을 사용하여 고속 정렬 알고리즘과 같은 효율적인 알고리즘 작업을 구현할 수 있습니다. 고속 정렬 알고리즘(QuickSort)은 벤치마크 요소를 찾아 요소를 두 개의 하위 시퀀스로 나누고 벤치마크 요소보다 크거나 같은 요소를 왼쪽에 배치합니다. 요소는 오른쪽에 배치됩니다. 그런 다음 왼쪽 및 오른쪽 하위 시퀀스가 배치됩니다.

C#에서 선택 정렬 알고리즘 구현 방법 선택 정렬(SelectionSort)은 간단하고 직관적인 정렬 알고리즘으로, 매번 정렬할 요소 중에서 가장 작은(또는 가장 큰) 요소를 선택하여 마지막에 넣는 것이 기본 아이디어입니다. 정렬된 순서. 모든 요소가 정렬될 때까지 이 과정을 반복합니다. 특정 코드 예제와 함께 C#에서 선택 정렬 알고리즘을 구현하는 방법에 대해 자세히 알아보세요. 선택 정렬 방법 만들기 먼저 선택 정렬을 구현하기 위한 방법을 만들어야 합니다. 이 방법은

C++에서 기수 정렬 알고리즘을 사용하는 방법 기수 정렬 알고리즘은 정렬할 요소를 제한된 숫자 집합으로 나누어 정렬을 완료하는 비비교 정렬 알고리즘입니다. C++에서는 기수 정렬 알고리즘을 사용하여 정수 집합을 정렬할 수 있습니다. 아래에서는 특정 코드 예제를 사용하여 기수 정렬 알고리즘을 구현하는 방법을 자세히 설명합니다. 알고리즘 아이디어 기수 정렬 알고리즘의 아이디어는 정렬할 요소를 제한된 디지털 비트 세트로 나눈 다음 각 비트의 요소를 차례로 정렬하는 것입니다. 각 비트별 정렬이 완료되었습니다.

배열 정렬 알고리즘은 요소를 특정 순서로 정렬하는 데 사용됩니다. 일반적인 유형의 알고리즘은 다음과 같습니다. 버블 정렬: 인접한 요소를 비교하여 위치를 바꿉니다. 선택 정렬: 가장 작은 요소를 찾아 현재 위치로 바꿉니다. 삽입 정렬: 올바른 위치에 요소를 하나씩 삽입합니다. 빠른 정렬: 분할 및 정복 방법, 피벗 요소를 선택하여 배열을 분할합니다. 병합 정렬: 분할 및 정복, 재귀 정렬 및 하위 배열 병합.

다양한 시나리오의 경우 적절한 PHP 배열 정렬 알고리즘을 선택하는 것이 중요합니다. 버블 정렬은 안정성 요구 사항이 없는 소규모 배열에 적합합니다. 빠른 정렬은 대부분의 경우 시간 복잡도가 가장 낮습니다. 병합 정렬은 안정성이 요구되는 상황에 적합합니다. ; 힙 정렬은 최대값 또는 최소값을 효율적으로 찾습니다. 실제 사례를 비교해보면 시간 효율성 측면에서 다른 알고리즘보다 퀵 정렬이 우수하지만, 안정성을 고려해야 할 경우에는 병합 정렬을 선택하는 것이 좋습니다.
