php - 排序算法出错
问题描述
我试图将排序方法从 Javascript 转换为 php,但我遇到了一些麻烦。
代码如下所示:
private static function quicksort($ids, $dists, $left, $right) {
if ($right - $left <= 20) {
for ($i = $left + 1; $i <= $right; $i++) {
$temp = $ids[$i];
$tempDist = $dists[$temp];
$j = $i - 1;
while ($j >= $left && $dists[$ids[$j]] > $tempDist) {
$ids[$j + 1] = $ids[$j--];
}
$ids[$j + 1] = $temp;
}
} else {
$median = ($left + $right) >> 1;
$i = $left + 1;
$j = $right;
self::swap($ids, $median, $i);
if ($dists[$ids[$left]] > $dists[$ids[$right]]) self::swap($ids, $left, $right);
if ($dists[$ids[$i]] > $dists[$ids[$right]]) self::swap($ids, $i, $right);
if ($dists[$ids[$left]] > $dists[$ids[$i]]) self::swap($ids, $left, $i);
$temp = $ids[$i];
$tempDist = $dists[$temp];
while (true) {
do $i++; while ($dists[$ids[$i]] < $tempDist);
do $j--; while ($dists[$ids[$j]] > $tempDist);
if ($j < $i) break;
self::swap($ids, $i, $j);
}
$ids[$left + 1] = $ids[$j];
$ids[$j] = $temp;
if ($right - $i + 1 >= $j - $left) {
self::quicksort($ids, $dists, $i, $right);
self::quicksort($ids, $dists, $left, $j - 1);
} else {
self::quicksort($ids, $dists, $left, $j - 1);
self::quicksort($ids, $dists, $i, $right);
}
}
}
private static function swap($arr, $i, $j) {
$tmp = $arr[$i];
$arr[$i] = $arr[$j];
$arr[$j] = $tmp;
}
我使用以下参数运行此代码:
- $ids - 包含 80 个对象的数组
- $dists - 包含 80 个对象的数组
- $左 - 0
- $ 对 - 79
并在这一行得到一个错误,说 Undefined offset: 161
do $i++; while ($dists[$ids[$i]] < $tempDist);
解决方案
推荐阅读
- css - CSS 网格底部填充
- reactjs - 这是从哪里来的:警告:列表中的每个孩子都应该有一个唯一的“关键”道具
- android - Android:防止软键盘在聊天窗口中关闭
- numpy - 如何在 xarray resample 函数中获取每日最大值的确切坐标?
- javascript - 在字符串数组中使用正则表达式
- angular - 无法绑定到“formGroup”,因为它不是 Angular 8 中“form”的已知属性
- javascript - 按键中的多个函数,调用第二个函数,直到第一个函数完成
- lisp - 创建一个返回列表的函数,该列表包含列表的所有其他值
- python - python中属性中“str”对象的使用
- mobile - 在启动时导航到移动应用程序中的非主页是否可以接受