정렬 함수를 사용하지 않고 배열을 정렬하는 "버블 정렬 알고리즘"

9260 단어 PHP알고리즘

도전



아래와 같은 GET 포스트가 건너왔다고 가정해, 그것을 소트 함수를 사용하지 않고 작은 순서로 재 배열한다고 하는 기능을 PHP로 만드는 학습으로 시행착오했으므로 그 자취를 남겨 두고 싶다.
http://localhost:10080/index.php?array=3,2,1,4,15,18,13,99,77,66,1,100,0

거품 정렬이라는 알고리즘으로 이것을 실현할 수 있습니다. 버블 정렬은 하나의 루프 안에 또 하나의 루프를 만들고 내부 루프에서 인접한 숫자의 크고 작은 크기를 비교하여 정렬하여 배열 전체를 정렬합니다. Wikipedia 설명 이해하기 쉽습니다.

구현


<?php
$array = explode(',', $_GET['array']); //explode()はExcelの「区切り」みたいなもの

$count = count($array);
for ($i = 0; $i < $count; $i++) {
  for ($n = 1; $n < $count; $n++) {
    if($array[$n-1] > $array[$n]) {
      $temp = $array[$n]; //右隣の方が大きかったらその右の数字を$tempに逃がす
      $array[$n] = $array[$n-1]; //左側を右側に代入
      $array[$n-1] = $temp; //逃がしていた右側を左側に代入
    }
  }
}
print_r($array);
?>

알고리즘과는 관계가 없는 PHP의 복습입니다만, $_GET (은)는 PHP 의 정의 끝난 변수로, URL 로 건네받은 파라미터 (쿼리 스트링, 쿼리 캐릭터 라인과 동의)를 받습니다. 참고→ URL 매개변수
$_GET은 PHP 함수 urldecode()가 처리 한 다음 값을 전달하는 것 같습니다.

결과



이대로 정렬되어 있습니다 ↓


개선


$n-1이 여러 번 나오는 것이 걱정되었기 때문에 이렇게했습니다 ↓
제대로 같은 결과를 얻을 수 있습니다.
$count = count($array);
for ($i = 0; $i < $count; $i++) {
  for ($b = 1; $b < $count; $b++) { //右隣の数字を$bとする
    $a = $b-1; //←左隣の数字を$aとする
    if($array[$a] > $array[$b]) {
      $temp = $array[$b];
      $array[$b] = $array[$a];
      $array[$a] = $temp;
    }
  }
}

여담



시행착오의 흔적으로서, 이쪽이 최초로 트라이한 코딩입니다. 배열중에서 가장 작은 값을 찾아 다른 변수에 대입해, 그 값을 원의 배열로부터 삭제한다고 하는 것입니다. 이것이라고 같은 수가 복수개 있었던 경우(이번이라고 1이 2회 있다), 그 수는 1개 밖에 꺼낼 수 없었습니다.http://localhost:10080/php-pre-challenge2/index.php?array=3,2,1,4,15,18,13,99,77,66,1,100,0
<?php
$array = explode(',', $_GET['array']);

$sorted_array = [];
$count = 0;
while ($count < count($array)) {
  $tmp = null;
  foreach ($array as $key => $value) {
    if (in_array($value, $sorted_array)) continue;
    if ($tmp === null) {
      $tmp = $value;
    } else {
      $tmp = min($tmp, $value);
    }
  }
  $sorted_array[] = $tmp;
  $count++;
}

print_r($sorted_array);

?>

결과 ↓ 보시는 대로 1가 하나밖에 꺼낼 수 없습니다.


지적 등이 있으면 코멘트에서 부탁드립니다!

좋은 웹페이지 즐겨찾기