以下を提案します。ソートされていない x リストと y リストを生成します。
xs = [3, 15, 7, 5, 4, 9 ]
ys = [7, 4, 11, 0, 7, 12]
各要素をタプルに変換します。最初のペアは座標で、2 番目は元のインデックスです。
xs = [(3, 0), (15, 1), ( 7, 2), (5, 3), (4, 4), ( 9, 5)]
ys = [(7, 0), ( 4, 1), (11, 2), (0, 3), (7, 4), (12, 5)]
両方のリストを並べ替えます。
xs = [(3, 0), (4, 4), (5, 3), (7, 2), ( 9, 5), (15, 1)]
ys = [(0, 3), (4, 1), (7, 0), (7, 4), (11, 2), (12, 5)]
配列を作成しますy_positions
。配列の n 番目の要素には、元々インデックス n にあった y 要素の現在のインデックスが含まれます。
空の を作成しますindex_list
。の各要素について、タプルの 2 番目のペアであるxs
を取得します。指定された で y 要素の現在のインデックスを取得するためにoriginal_index
使用します。現在のインデックスを に追加します。y_positions
original_index
index_list
xs
最後に、とからインデックス値を削除しますys
。
Python の実装例を次に示します。
points = ((3, 7), (15, 4), (7, 11), (5, 0), (4, 7), (9, 12))
#generate unsorted lists
xs, ys = zip(*points)
#pair each element with its index
xs = zip(xs, range(len(xs)))
ys = zip(ys, range(len(xs)))
#sort
xs.sort()
ys.sort()
#generate the y positions list.
y_positions = [None] * len(ys)
for i in range(len(ys)):
original_index = ys[i][1]
y_positions[original_index] = i
#generate `index_list`
index_list = []
for x, original_index in xs:
index_list.append(y_positions[original_index])
#remove tuples from x and y lists
xs = zip(*xs)[0]
ys = zip(*ys)[0]
print "xs:", xs
print "ys:", ys
print "index list:", index_list
出力:
xs: (3, 4, 5, 7, 9, 15)
ys: (0, 4, 7, 7, 11, 12)
index list: [2, 3, 0, 4, 5, 1]
y_positions
との生成index_list
は O(n) 時間であるため、全体としてのアルゴリズムの複雑さは、並べ替えステップによって支配されます。