2017年9月21日 星期四

[Algorithm] 快速排序坐標的大小

如果要在1d空間中比對大小,只需兩變數直接比對即可。

假設兩坐標 X1, X2,
if ( X1 > X2 ) {
    qDebug() << "X1 > X2" ;
} else {
    qDebug() << "X1 < X2";
}

而Nd(N>1)空間中坐標比對,也可利用這個模式,先將維度降為1D,在進行排序即可知道順序。範例:在2D空間共有4個坐標,分別為(1,1),(1,2),(,2,1),(2,2),希望可以從左到右,從上到下的排序。步驟如下:
  • 第一步驟:先降維度
    • 如果排序順序為由左到右,由上到下,公式:( X + 10000*Y) 
    • 如果排序順序為由上到下,由左到右,公式:( 10000*X + Y)
  • 第二步驟:排序

Sample Code :
int array[][] = {{1,1},{1,2},{2,1},{2,2}};

QList<int> vals;
for (int i=0; i<array.length; i++ ) {
    vals[i] = array[i][0] + 10000*array[i][1];
}
qSort(vals); 

Note :
該方法需注意,
    1. 放大倍数参数一定要大于 X 或 Y 的最大值
    2. Nd以上做法一樣,如3D公式如 X + 10000*Y + 10000000 * Z (注意別Overflow)

Reference :
[1] http://www.grasshopper3d.com/forum/topics/sorting-points-by-x-and-y

沒有留言:

張貼留言