PHPによるアルゴリズム ソート 基本交換法(シェーカー・ソート)

snow
2022-08-26
snow
2022-08-26

説明


基本交換法(シェーカー・ソート):

バブル・ソートでは部分数列が正しく並んでいたとしても、全部を比較を繰り返しているため、効率が悪いです。
それを解消するためのソート法は シェーカー・ソートです。

アルゴリズム:

左と右両方から、隣接2項目を比較し、後ろの項目が前の項目より小さければ、両項目の入れ替えを行い、
最終入れ替えの位置をshiftに記憶しておき、左からのshiftは右からのshiftより小さければ、
処理を繰り返する


PHPソース:


```
<?php

/**
* 1000以内の乱数を生成する
*
* @param int $count
* @return array
*/
function createRandArray($count) {
$arr = [];
for ($i=0; $i<$count; $i++) {
$arr[] = mt_rand(1, 1000);
}
return $arr;
}

/**
* 表示
*
* @param array $arr
*/
function sprint($arr) {
foreach ($arr as $num) {
print("$num ");
}
print("\n");
}

/**
* ソート
*
* @param array $arr
* @return array
*/
function shakerSort($arr) {

$left = 0;
$right = count($arr) - 1;
while ($left < $right) {
for ($i=$left; $i<$right; $i++) {
if ($arr[$i] > $arr[$i+1]) {
$t = $arr[$i];
$arr[$i] = $arr[$i+1];
$arr[$i+1] = $t;
$shift = $i;
}
}
$right = $shift;
for ($i=$right; $i>$left; $i--) {
if ($arr[$i] < $arr[$i-1]) {
$t = $arr[$i];
$arr[$i] = $arr[$i-1];
$arr[$i-1] = $t;
$shift = $i;
}
}
$left = $shift;
}
return $arr;
}

$arr = createRandArray(10);
sprint($arr);

$arr = shakerSort($arr);
sprint($arr);

```

結果:

```
$ php shaker.php
761 841 461 359 25 169 285 805 292 171
25 169 171 285 292 359 461 761 805 841
```