Zig-zag scan an N x N array

前端 未结 8 1377
暗喜
暗喜 2021-01-30 08:40

I have a simple array. The array length always has a square root of an integer. So 16, 25, 36 etc.

$array = array(\'1\', \'2\', \'3\', \'4\' ... \'25\');
         


        
8条回答
  •  一生所求
    2021-01-30 09:23

    One more PHP solution, using just for and if, traverses array only once

    function waveSort(array $array) {
    
        $elem = sqrt(count($array));
    
        for($i = 0; $i < $elem; $i++) {
            $multi[] = array_slice($array, $i*$elem , $elem);
        }
    
        $new = array();
        $rotation = false;
        for($i = 0; $i <= $elem-1; $i++) {
            $k = $i;
            for($j = 0; $j <= $i; $j++) {
                if($rotation)
                    $new[] = $multi[$k][$j];
                else
                    $new[] = $multi[$j][$k];
                $k--;
            }   
            $rotation = !$rotation;
        }
    
        for($i = $elem-1; $i > 0; $i--) {
            $k = $elem - $i;
    
            for($j = $elem-1; $j >= $elem - $i; $j--) {
    
                if(!$rotation)
                    $new[] = $multi[$k][$j];
                else
                    $new[] = $multi[$j][$k];
                $k++;
            }   
            $rotation = !$rotation;
        }
    
        return $new;
    }
    
    $array = range(1, 25);
    $result = waveSort($array);
    print_r($result);
    
    $array = range(1, 36);
    $result = waveSort($array);
    print_r($result);
    

    Here it is in action

提交回复
热议问题