>백엔드 개발 >PHP 문제 >PHP 배열 - 병합 정렬을 사용하는 방법은 무엇입니까?

PHP 배열 - 병합 정렬을 사용하는 방법은 무엇입니까?

慕斯
慕斯원래의
2021-06-24 16:28:121254검색

우리는 PHP의 배열에 대해 너무 많이 알고 있습니다. 여러분이 병합 정렬에 대해 얼마나 알고 있는지는 모르겠습니다. 따라서 이 부분에 대해서는 걱정하지 마십시오. 이 내용을 더 깊이 이해해 보세요.

관련 추천: PHP 배열의 검색 알고리즘은 무엇인가요? 그것을 찾는 방법?

병합 정렬:

병합 정렬(ERGE-SOQfT)은 병합 작업을 기반으로 하는 효과적인 정렬 알고리즘입니다. 이 알고리즘은 분할 및 정복 방법의 매우 일반적인 응용 프로그램입니다. 이미 정렬된 하위 시퀀스를 병합하여 완전히 정렬된 시퀀스를 얻습니다. 즉, 먼저 각 하위 시퀀스를 순서대로 만든 다음 하위 시퀀스 세그먼트를 순서대로 만듭니다. 두 개의 순서 목록이 하나의 순서 목록으로 병합되는 경우 이를 양방향 병합이라고 합니다. 코드를 예로 들어보겠습니다.

<?php
//PHP数组排序算法:合并算法.
//二路归并
$arr1 = array(1,3,5);
$arr2 = array(2,4,6);
//取出一个空数组用于归并空间
$arr3 = array();
while(count($arr1) & count($arr2)){
//只要$arr1和$arr2里面还有元素,就进行循环
//取出每个数组的第-一个元素:进行比较
$arr3[] = $arr1[0] < $arr2[0] ? array_shift($arr1) : array_shift($arr2);
}
//合并结果
print_r(array_merge($arr3 ,$arr1,$arr2));

결과는 다음과 같습니다.

PHP 배열 - 병합 정렬을 사용하는 방법은 무엇입니까?

병합 정렬 알고리즘은 다음과 같습니다.

1) 배열을 두 개의 배열로 분할합니다. .

2) 1단계를 반복하여 배열을 가장 작은 단위로 분할합니다. .

3) 정렬된 두 시퀀스의 합이 되도록 공간을 적용합니다. 이 공간은 병합된 시퀀스를 저장하는 데 사용됩니다.

4) 두 개의 포인터를 설정합니다. 초기 위치는 두 개의 정렬된 시퀀스의 시작 위치입니다. .

5) 두 포인터가 가리키는 요소를 비교하여 상대적으로 작은 요소를 선택하여 병합 공간에 넣은 후 포인터를 다음 위치로 이동합니다.

6) 포인터가 시퀀스의 끝을 초과할 때까지 3단계를 반복합니다. .

7) 다른 시퀀스의 나머지 모든 요소를 ​​병합된 시퀀스의 끝 부분에 직접 복사합니다.

코드는 다음과 같습니다.

$arr = array(4,7,2,1,5,9,3);
//归并排序函数
function merge_sort($arr){
//递归出口
$len = count($arr);
if($len <= 1) return $arr;
//拆分.
$middle = floor($len / 2);
$left = array_slice($arr,0, $middle);
$right = array_slice($arr, $midd1e);
//假设左边和右边都已经排好序:二路归并
$m = array();
while(count($left) && count($right)){
//只要$arr1和$arr2里面还有元素,就进行循环
//取出每个数组的第一个元素: 进行比较
$arr3[] = $left[0] < $right[0] ? array_shift($left) : array_shift($right);
}
//返回结果
return array_merge($m, $left ,$right);
}
print_r(merge_sort($arr));

PHP 배열 - 병합 정렬을 사용하는 방법은 무엇입니까?

추천 학습: "PHP 비디오 튜토리얼"

위 내용은 PHP 배열 - 병합 정렬을 사용하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.