假设我们有两个数组:
a = [4,3,8,7]
b = [(1,2),(5,6),(8,6),(9,0)]
所以我们现在想要的是,对数组 a 进行排序。 所以排序的结果应该是
a_sorted = [3,4,7,8]
。
并且,我们不能对数组 b 进行排序。
相反,数组 b 的顺序必须根据数组 a 的排序顺序进行更改。
所以,数组 b 一定是
b_sorted = [(5,6),(1,2),(9,0),(8,6)]
即 a_sorted 的顺序将是
a_sorted = [a[1],a[0],a[3],a[2]]
。
相应地,b_sorted = [b[1],b[0],b[3],b[2]]
问题比较简单。这种排序有名字吗? :
您只需找到一个数组的排序排列(a 为 [2,1,4,3] )并将其应用于另一个数组。许多语言都能很好地处理这个问题。
例如,在 Matlab 中,您可以调用
[sortedA, sortedBy] = sort([4 3 8 7]);
然后 sortedA = a(sortedBy) = [3 4 7 8]
和 sortedBy = [2 1 4 3]
,因此您的新 b 将是 b(sortBy)
。
其实,这种事情并不少见,虽然现在不像过去那么普遍了。它是标签排序思想的扩展,其中键被排序,然后按顺序读取和写入相应的记录。您通常会在以下情况下使用标签排序:
或
第二个现在并不是经常出现的问题,因为您通常对引用数组进行排序,这意味着唯一交换的内容是指针 - 每个 4 字节或 8 字节。
一些 API 内置支持这种类型的并行数组排序。例如,.NET
Array
类有一个 Sort(array, array) 方法,其工作原理与您所描述的完全一样。
我不认为这样的东西有一个名字。请注意,这种“并行数组”通常不受欢迎,并且经常被刚接触编程但没有被教导如何正确使用类的人(学生)使用(无意冒犯)。如果两个数组之间存在关系,则应将它们放入某种对象中,然后对该对象进行排序。
当然,这一切都取决于具体情况。人们可能使用的语言无法对(自定义)对象中的相关属性进行分组。
将
b
的值添加到 a
的键中,这样就得到了一个多维数组。然后对该数组进行排序。
是的,PHP 中有一个名为 array_multisort 的数组排序函数,它可以满足您的需求。