坐标排序算法
Tuesday, 4. March 2008, 02:17:05
将(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";
}
?>
题目很简单,有兴趣的同志可以试试。







