PHP 정렬 알고리즘 의 병합 정렬(Merging Sort)실례 상세 설명
기본 사상:
병합 정렬:병합(합병)의 사상 을 이용 하여 정렬 하 는 방법 이다.그 원 리 는 초기 서열 에 n 개의 요 소 를 포함 하고 있다 고 가정 하면 n 개의 질서 있 는 하위 서열 로 볼 수 있다.각 하위 서열 의 길 이 는 1 이 고 두 개의 병합 을 통 해 전체 8968°n/2*8969°(*8968°x*8969°x 보다 작 지 않 은 최소 정수)개의 길 이 는 2 또는 1 의 질서 있 는 서열 을 얻 을 수 있다.두 번 더 합치 면.................................................................................
1.병합 의 과정:
a[i]a 배열 의 앞부분(순서 가 정 해 져 있 음),a[j]a 배열 의 뒷부분(순서 가 정 해 져 있 음)
r 배열 은 정렬 된 a 배열 을 저장 합 니 다.
a[i]와 a[j]의 크기 를 비교 하고 a[i]≤a[j]라면 첫 번 째 질서 표 의 요소 a[i]를 r[k]에 복사 하고 i 와 k 를 각각 1 로 추가 합 니 다.그렇지 않 으 면 두 번 째 질서 표 의 요소 a[j]를 r[k]에 복사 하고 j 와 k 를 각각 1 을 더 해서 그 중의 질서 표 가 끝 날 때 까지 순환 한 다음 에 다른 질서 표 의 나머지 요 소 를 r 에서 아래 표 k 에서 아래 표 t 의 단원 으로 복사 합 니 다.정렬 을 병합 하 는 알고리즘 은 보통 재 귀적 으로 이 루어 집 니 다.먼저 정렬 대기 구간[s,t]을 중심 점 2 점 으로 나 눈 다음 에 왼쪽 부분 구간 을 정렬 한 다음 에 오른쪽 부분 구간 을 정렬 하고 마지막 으로 왼쪽 구간 과 오른쪽 구간 을 한 번 에 병합 하여 질서 있 는 구간[s,t]으로 합 칩 니 다.
2.병합 작업:
병합 작업(merge)은 병합 알고리즘 이 라 고도 하 는데 두 순서 서열 을 하나의 순서 서열 로 합 치 는 방법 을 말한다.
수열{6,202,100,301,38,8,1}이 있 으 면
초기 상태:6,202,100,301,38,8,1
첫 번 째 병합 후:{6,202},{100,301},{8,38},{1},비교 횟수:3;
두 번 째 병합 후:{6,100,202,301},{1,8,38},비교 횟수:4;
세 번 째 병합 후:{1,6,8,38,100,202,301},비교 횟수:4;
총 비교 횟수 는:3+4+4=11,;
역순 수 는 14 이다.
3.알고리즘 설명:
병합 작업 의 작업 원 리 는 다음 과 같다.
첫 번 째 단계:신청 공간 은 두 개의 정렬 된 서열 의 합 이 고 이 공간 은 합 친 서열 을 저장 하 는 데 사 용 됩 니 다.
두 번 째 단계:두 개의 지침 을 설정 하고 첫 번 째 위 치 는 정렬 된 두 개의 시작 위치 입 니 다.
세 번 째 단계:두 포인터 가 가리 키 는 요 소 를 비교 하고 상대 적 으로 작은 요 소 를 선택 하여 합병 공간 에 넣 고 포인터 를 다음 위치 로 이동 합 니 다.
어떤 포인터 가 시퀀스 끝 을 초과 할 때 까지 3 단 계 를 반복 합 니 다.
다른 시퀀스 에 남 은 모든 요 소 를 병합 시퀀스 끝 에 직접 복사 합 니 다.
알고리즘 구현:
우선 주 함수 부분 을 살 펴 보 겠 습 니 다.
//
function swap(array &$arr,$a,$b){
$temp = $arr[$a];
$arr[$a] = $arr[$b];
$arr[$b] = $temp;
}
//
function MergeSort(array &$arr){
$start = 0;
$end = count($arr) - 1;
MSort($arr,$start,$end);
}
총 함수 에서 우 리 는 하나의 MSort()함수 만 호출 했 습 니 다.우 리 는 재 귀적 호출 을 사용 해 야 하기 때문에 MSort()를 패키지 합 니 다.다음은
MSort()
함수:
function MSort(array &$arr,$start,$end){
// 1 ,$start == $end,
if($start < $end){
$mid = floor(($start + $end) / 2); // $arr $arr[$start - $mid] $arr[$mid+1 - $end]
MSort($arr,$start,$mid); // $arr[$start - $mid] $arr[$start - $mid]
MSort($arr,$mid + 1,$end); // $arr[$mid+1 - $end] $arr[$mid+1 - $end]
Merge($arr,$start,$mid,$end); // $arr[$start - $mid] $arr[$mid+1 - $end] $arr[$start - $end]
}
}
위의MSort()
함 수 는 배열 을 반 으로 나 누 어 반 으로 나 눈 다음 에 하위 서열 의 길 이 를 1 로 나 눈 다음 에 하위 서열 을 합 친다.지금 은 우리 의 병합 조작 함수 입 니 다
Merge()
:
//
function Merge(array &$arr,$start,$mid,$end){
$i = $start;
$j=$mid + 1;
$k = $start;
$temparr = array();
while($i!=$mid+1 && $j!=$end+1)
{
if($arr[$i] >= $arr[$j]){
$temparr[$k++] = $arr[$j++];
}
else{
$temparr[$k++] = $arr[$i++];
}
}
// $temparr
while($i != $mid+1){
$temparr[$k++] = $arr[$i++];
}
// $temparr
while($j != $end+1){
$temparr[$k++] = $arr[$j++];
}
for($i=$start; $i<=$end; $i++){
$arr[$i] = $temparr[$i];
}
}
여기까지 오 면 우리 의 병합 알고리즘 은 끝장 이다.우리 호출 해 보 자:
$arr = array(9,1,5,8,3,7,4,6,2);
MergeSort($arr);
var_dump($arr);
실행 결과:
array(9) {
[0]=>
int(1)
[1]=>
int(2)
[2]=>
int(3)
[3]=>
int(4)
[4]=>
int(5)
[5]=>
int(6)
[6]=>
int(7)
[7]=>
int(8)
[8]=>
int(9)
}
복잡 도 분석:병합 알고리즘 은 원래 의 서열 이 질서 가 있 든 없 든 그룹 을 나 누고 비교 하기 때문에 가장 좋 고 최 악의 시간 복잡 도 는 모두 O(nlogn)이다.
병합 알고리즘 은 안정 적 인 정렬 알고리즘 이다.
본 고 는 을 참고 하여 여기 서 기록 만 하고 나중에 조회 하기에 편리 하 며 큰 신 은 뿌리 지 마 세 요!
PS:정렬 에 관 한 프 리 젠 테 이 션 도 구 를 추천 합 니 다.참고 하 시기 바 랍 니 다.
온라인 애니메이션 프레젠테이션 삽입/선택/거품/병합/힐/빠 른 정렬 알고리즘 프로 세 스 도구:
대화 데이터 구조
더 많은 PHP 관련 내용 에 관심 이 있 는 독자 들 은 본 사이트 의 주 제 를 볼 수 있다.
본 논문 에서 말 한 것 이 여러분 의 PHP 프로 그래 밍 에 도움 이 되 기 를 바 랍 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
laravel에 yo에서 angularJs&coffeescript를 사용할 수 있도록 한다.먼저 yo 명령을 사용할 수 있어야하므로 아래에서 설치 global에 설치한 곳에서 laravel의 프로젝트 루트로 이동. 클라이언트 코드를 관리하는 디렉토리를 만들고 이동합니다. 클라이언트 환경 만들기 이것으로 히...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.