2017-09-17 1 views
1

이것은() 페이지 php.net의에 usort에서 예 # 1 :PHP에서 usort() 단계를 보는 방법은 무엇입니까?

<?php 
function cmp($a, $b) { 
    if ($a == $b) { 
     return 0; 
    } 
    return ($a < $b) ? -1 : 1; 
} 

$a = array(3, 2, 5, 6, 1); 

usort($a, "cmp"); 

foreach ($a as $key => $value) { 
    echo "$key: $value\n"; 
} 
?> 

에 usort 함수는 쌍으로 배열 내의 값 ($ A- $ B를 얻어, 이렇게이다 - 3-2 , 2-5, 5-6, 6-1) cmp() 함수가 -1, 0 또는 1을 반환하는지 여부에 따라 $ b 값을 이동합니다. -1이면 $ b가 현재 쌍), 0 인 경우 같은 위치에 있고 1 인 경우 위로 이동합니다. 이것이 php.net의 수동 usort() 페이지의 최상위 주석을 기반으로 작동하는 방법입니다.

이 작업이 단계별로 (소팅 프로세스) 어떻게 작동하는지 볼 수있는 방법이 있습니까? 나는 그것을 볼 수 있습니까 아니면 정렬이 완료된 후에 최종 결과를 볼 수 있습니까? 이 프로세스가 어떻게 작동하는지 완전히 이해하고 싶습니다.

+0

내가() 정렬이 특정에 usort의 단계를보고 저를 가능하게 할 PHP 코드의 조각을 쓸 수 (또는 '퀵 알고리즘 시각화 "를 구글) http://www.algomation.com/algorithm/quick-sort-visualization에서의 vizualisation를 볼 수 있습니까? –

+0

PHP는 정렬 알고리즘을 구현하고 두 항목을 비교해야 할 때, 두 번째 인수로 제공하는 콜백을'usort()'에 사용합니다. 수십 개의 정렬 알고리즘이 있습니다. PHP는 아마도 quicksort를 사용합니다 (가장 빠른 정렬 알고리즘 중 하나입니다). PHP 소스를 확인하면 알 수 있습니다. 또한 비교 함수가 인수에 대한 정보를 표시 할 수 있습니다. 정렬 알고리즘이 좋다면이 정보를 기반으로 알고리즘을 식별 할 수 있습니다. 그렇지 않다면 글쎄, 나는 너를 너무 많이 도와주지 않는다고 생각한다. (그리고 당신은 어떤 정렬 알고리즘을 배워야한다.) – axiac

+0

예,이 설명서 페이지의 맨 위 주석을 기반으로 한 usort라고 생각합니다. 나는이 단계를 볼 수 있는지 궁금합니다. 그렇지 않습니까? 끝날 때/끝에서 결과를 제공합니까? 이것이 quicksort 경우이 작동하는 방법을 조사해야 할 것 같아요. 편집 : 그럼 아마 방법을 PHP 수준에서보고 그냥 Quicksort 봐? –

답변

0

비교 함수에서 일부 디버그 출력을 사용하면 PHP에서 수행 한 비교 만 볼 수 있지만 배열의 중간 상태는 볼 수 없습니다.

그러나 usort에서 사용되는 알고리즘은 잘 알려져 있습니다. QuickSort (Which sort algorithms does PHP's usort apply?)입니다.

당신은

+0

echo 문에서 혼합 할 수 있고 var_dump도 사용할 수 있다는 것을 알았습니다. 이는 코드의 작동 방식을 보여줍니다. 배열이 프로세스의 중간에서 변경되지 않고 끝에 만 변경되는 것처럼 보입니다. –

+0

https://pastebin.com/5z0m1Yvp -이 코드를 사용하면 usort가 12 개의 별도 $ a 및 $ b 쌍을 생성하고이 시점까지는 6이 될 것이라고 생각했습니다. 2-1, 1-3 , 3-4, 4-2, 2-1, 1-2. 이것은 실제로 2-1, 2-3, 1-3, 2-4, 3-4, 2-2, 2-1, 2-1 (같은 쌍을 다시?), 4-1, 3 -1, 1-1, 2-2. 이것은 1, 1, 0, 1, 0, 0, 1, 1, 1, 1, 0, 0을 반환합니다. –

관련 문제