yの上位ビット、xの上位ビット、…の順で下位ビットへと交互に比較してソートします。
座標が近ければデータも近い、とか
データが近ければ座標も近い、という保証はありませんが、
座標が近いデータは近くに並びやすくなります。
あらかじめ、xとyの値をスケーリングしておく必要があります。
(または、下のコードでは、ビットマスク mask をy座標・x座標で別々にするなど)
C言語の例を示します。(xもyも0〜255の場合)
一般的なコンピュータでは、上から下、左から右の順に並びます。
(数学のxy座標では下から上、左から右の順になります)
C言語
1#include <stdlib.h>
2struct cood_s
3 {
4 int x; /* x座標*/
5 int y; /* y座標*/
6 /* その他属性… */
7 };
8typedef struct cood_s cood;
9cood coods[100];
10/* 値を設定… */
11
12#define AX ( ( (cood *)a )-> x )
13#define BX ( ( (cood *)b )-> x )
14#define AY ( ( (cood *)a )-> y )
15#define BY ( ( (cood *)b )-> y )
16static int compare(const void *a, const void *b)
17{
18int mask;
19int diff;
20
21for ( mask=0x80; mask ; mask >>= 1 )
22 {
23 diff = (AY & mask) - (BY & mask);
24 if (diff) return(diff);
25 diff = (AX & mask) - (BX & mask);
26 if (diff) return(diff);
27 }
28return(0);
29}
30
31static void sort_coods(coods, coodcnt)
32cood *coods; /* in 座標リスト */
33int coodcnt; /* in 座標の組の数*/
34{
35qsort(coods, coodcnt, sizeof(cood), compare);
36}
37
図にすると、x,y 各1ビットでは
┌─┬─┐
│0→1│
├─/─┤
│2→3│
└─┴─┘
x,y 各2ビットでは、これを再帰的に適用して
┌─┬─┬─┬─┐
│0→①│④→⑤│
├─/─/─/─┤
│②→③│⑥→⑦│
├─┼─┼─┼─┤
│⑧→⑨│⑫→⑬│
├─/─/─/─┤
│⑩→⑪│⑭→⑮│
└─┴─┴─┴─┘
のようになります。
座標の近傍をすべて探し出すには、
やはりcoco_bauerさんのようにインデックスを2本用意する必要があるかもしれません。
あまり厳密でない用途では、上記コードのxy混成ソートが役に立つかもしれません。
・地図アプリで近くの店を提案する
・戦略ゲームで近くの基地を提案する など
座標にひもづけられた大きなデータを格納する場合に、
図のようなソート順にするとキャッシュのヒット率が上がるといった
メリットがあるかもしれません。