Skip navigation.

极湖

无不用其“极”

坐标排序算法

, , ,

来自“どう書く?org”的题目:
将(x, y) 坐标按以下规则排序:
  • (x, y) 先后升序排列(先x升序,x相同的坐标,y升序)
  • 与 (0, 0) 的距离升序排列

我用 PHP 实现的程序(比较笨,仅供参考):
<?php
function sortXY($arrXY, $byDistance = false) {
    $arrSort = array();
    foreach ( $arrXY as $XY ) {
        $key = $byDistance ? $XY[0]*$XY[0] + $XY[1]*$XY[1] : $XY[0];
        if(!isset($arrSort[$key])) {
            $arrSort[$key] = array($XY);
        } else {
            $pos = count($arrSort[$key]);
            foreach ( $arrSort[$key] as $i=>$sameX ) {
                if($XY[1] < $sameX[1]) {
                    $pos = $i;
                    break;
                }
            }
            array_splice($arrSort[$key], $pos, 0, array($XY));
        }
    }

    ksort($arrSort);

    $arrResult = array();
    foreach ( $arrSort as $arrTmp ) {
        foreach ( $arrTmp as $XY ) {
            $arrResult[] = $XY;
        }
    }

    return $arrResult;
}


$arrXY = array(
    array(0, 0),
    array(3, 1),
    array(2, 9),
    array(2, 1),
    array(2, 2),
    array(1, 0),
    array(1, 1),
    array(3, 3),
    array(3, 2),
);

echo "(x, y) 先后升序:\n";
$arrAscXY = sortXY($arrXY);
foreach($arrAscXY as $XY) {
    list($X, $Y) = $XY;
    echo "($X, $Y)\n";
}
echo "\n与(0, 0)的距离升序:\n";
$arrAscDist = sortXY($arrXY, true);
foreach($arrAscDist as $XY) {
    list($X, $Y) = $XY;
    echo "($X, $Y) distance=". round(sqrt($X*$X + $Y*$Y), 2). "\n";
}
?>

题目很简单,有兴趣的同志可以试试。

用 JSON “包装”函数的试验VIM常用代码编辑命令

Write a comment

You must be logged in to write a comment. If you're not a registered member, please sign up.

July 2009
S M T W T F S
June 2009August 2009
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31