我的代码出了什么问题 - 循环排序的数组没有显示任何结果

Gin*_*van 16 php arrays sorted

我今天接受了采访,这个人问我这个问题:

如何轻松找到循环排序数组中的项目

由于我不知道答案,我试图找到解决方案.这就是我所拥有的:

谢谢

<?php


function searchincircularsorterlist($a, $len, $num) {
    $start=0;
    $end=$len-1;
    $mid = 0;
    while($start<$end) {
        $mid=$start+$end/2;
        if ($num == $a[$mid]) {
            return $num;
        }
        if($num<$a[$mid]) {
            if($num<$a[$start] && $a[$start]<=$a[$start+1])
            $start=$mid++;
            else
            $end=$mid--;
            }
        else {
            if($num>$a[$end] && $a[$end-1]<=$a[end])
            $end=$mid--;
            else
            $start=$mid++;
        }
    }
    if ($start == $end && $num == $a[$start]) {
        return $num;
    }
    return -1; 
}

$array = array(7,8,9,0,1,2,3,4,5,6);
var_dump(searchincircularsorterlist($array,sizeof($array),4));
Run Code Online (Sandbox Code Playgroud)

我正在尝试使用循环排序的数组但由于某种原因它不起作用.我的代码出了什么问题?

Boo*_*eus 22

1)学习操作的优先级.你应该:$ mid =($ start + $ end)/ 2; 最后将$ end除以$然后$ start - 结果.这就是你有一个无限循环的原因.

2)使用:$start=$mid+1;而不是$start=$mid++;那将有助于减少循环次数

<?php

function searchincircularsorterlist($a, $len, $num) {
    $start=0;
    $end=$len-1;
    $mid = 0;
    while($start<$end) {
        $mid=($start+$end)/2;
        if ($num == $a[$mid]) {
            return $num;
        }
        if($num<$a[$mid]) {
            if($num<$a[$start] && $a[$start]<=$a[$start+1])
            $start=$mid+1;
            else
            $end=$mid-1;
            }
        else {
            if($num>$a[$end] && $a[$end-1]<=$a[end])
            $end=$mid-1;
            else
            $start=$mid+1;
        }
    }
    if ($start == $end && $num == $a[$start]) {
        return $num;
    }
    return -1; 
}

$array = array(7,8,9,0,1,2,3,4,5,6);
var_dump(searchincircularsorterlist($array,sizeof($array),4));
Run Code Online (Sandbox Code Playgroud)