两个阵列串联排序的奇怪案例

时间:2011-05-26 19:41:50

标签: arrays algorithm sorting

假设我们有两个数组:

a = [4,3,8,7]
b = [(1,2),(5,6),(8,6),(9,0)] 

所以我们现在想要的是对数组a进行排序。 所以排序的结果应该是a_sorted = [3,4,7,8]。 并且,我们不能对数组b进行排序。 相反,必须根据数组a的排序顺序更改数组b的顺序。

因此,数组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]]

问题更简单。这种排序有名字吗? :

5 个答案:

答案 0 :(得分:3)

你只是找到一个数组的排序排列(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)

答案 1 :(得分:2)

我认为没有这样的名字。请注意,这样的“并行数组”通常是不受欢迎的,并且经常被新的编程人员(学生)使用,他们没有被教过如何正确使用类(没有冒犯意味着)。如果两个数组之间存在关系,则应将它们放在某种对象中,然后应该对该对象进行排序。

当然,这完全取决于具体情况。有人可能正在使用一种无​​法在(自定义)对象中对相关属性进行分组的语言。

答案 2 :(得分:2)

实际上,这种事情并不罕见,尽管今天它比过去更不普遍。它是标记排序思想的扩展,其中键被排序,然后按顺序读取和写入相应的记录。您通常在以下情况下使用标记排序:

  • 没有足够的内存来加载您要排序的所有记录,但您可以轻松加载密钥。

OR

  • 在排序过程中在内存中移动大型记录非常昂贵。交换密钥花费的时间更少。

第二个问题现在经常不是一个问题,因为你通常会对引用数组进行排序,这意味着唯一可以交换的东西是指针 - 每个字节4个字节或8个字节。

某些API内置支持此类并行数组排序。例如,.NET Array类的Sort(array, array)方法与您描述的方法完全相同。

答案 3 :(得分:1)

b的值添加到a的键中,以便获得多维数组。然后对该数组进行排序。

答案 4 :(得分:0)

是的,在PHP中有一个名为array_multisort的数组排序函数可以满足您的需求。