检查一次交换是否可以对数组进行升序排序

时间:2019-01-14 20:28:21

标签: php arrays

我有一个说$a=array(1, 2, 6, 4, 5, 3);的数组,可以按升序在交换中排序,例如交换6和3。如果可能的话,我的函数应该返回true,否则返回false。例如array(10,30,20,40,50,60,70)返回true,而array(80,10,30,20,40,50,60,70)返回false,因为它将花费多个交换到目前为止,我已经按照升序对数组进行排序。

function checksort($arr) {
    for ($i = count($arr) - 1; $i > 0; $i--) {
        if ($arr[$i] < $arr[$i - 1]) {
            $j = $i - 1;
            while ($j > 0) {
                $j--;
                $temp = $arr[$i];
                $arr[$i] = $arr[$j + 1];
                $arr[$j + 1] = $temp;
                break;
            }
        }
    }
    $sortedarray = $arr;
    sort($arr);
    if ($sortedarray == $arr) {
        return true;
    }
    return false;
}
$a = array(1, 2, 6, 4, 5, 3);
echo checksort($a);

我得到的结果是错误的,应该是正确的。我知道问题是因为该数组在for循环中的每个真实条件下都被重写,但是同时$i变为-1,并且到达无法进一步检查整个数组的程度。条件。

1 个答案:

答案 0 :(得分:3)

您的函数将仅交换彼此相邻的项,而不交换数组的另一端。

使用array_diff_assoc()仅查看原始数组和排序数组中的差异可能会更简单,这意味着这将使项目数混乱。如果大于2,则返回false,否则返回true ...

function checksort($arr){
    $b = $arr;
    sort($b);
    return count(array_diff_assoc($arr, $b))<=2;
}