【问题标题】:C# Sort And Search First Array Then Display Corresponding Values Of Related Arrays [duplicate]C#排序和搜索第一个数组,然后显示相关数组的对应值[重复]
【发布时间】:2016-07-29 20:26:03
【问题描述】:

我有多个数组,数组中的值需要逐列保持在一起。我想快速排序然后对第一个数组进行二进制搜索,然后根据对第一个数组的搜索显示其他数组中的所有值。但是,如果我对第一个数组进行排序,那么其他数组中的值将不再位于正确的位置。

(示例,非真实数据)未排序但正确的数据位置如下所示。

              array1{5,2,3,1,4}
              array2{6,9,1,7,8}
              array3{2,4,1,5,4}

当第一个数组被排序后,它应该是这样的。

 array1{1,2,3,4,5}
 array2{7,9,1,8,6}
 array3{5,4,1,4,2}

那么如果搜索到 2,它应该像这样显示。

 array1{2}
 array2{9}
 array3{4}

我的数组在 double[] 中。

【问题讨论】:

标签: c# arrays sorting search


【解决方案1】:

第一件事;像这样的链接数组表明,如果您对问题进行不同的建模,您可能会发现它会更容易。例如,如果数组是 x、y 和 x 坐标,那么最好使用这样的类;

public class Point3d { public int x; public int y; public int z; }

然后将点数组按x排序;

Array.Sort(listOfPoints, (d1,d2) => d1.CompareTo(d2));

一般来说,这样排列表明您实际上已经获得了垂直记录,您的代码可能会从这样处理中受益。

【讨论】:

  • @FirstStep 似乎他/她的意图是快速访问记录,而不是实际上对链接数组进行排序和搜索。这是该问题的解决方案,C# 中的代码很简单。我已经处理过的那种; Array.BinarySearch() 可以轻松处理第二部分。我应该提到...
【解决方案2】:
int index = 0;
// save original positions
var lookup = array.ToDictionary(x => x, x => index++);

// sort array
Array.Sort(array1);
foreach (var item in array)
{
    int originalIndex = lookup[item];
    ... array2[originalIndex]
}

其实有了这个字典,你就不需要对数组进行排序了。它甚至可以更快,因为构建字典是 O(N) 并且访问元素是 O(1)(均摊销)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-20
    • 1970-01-01
    • 2012-08-15
    • 2016-11-05
    • 2022-01-14
    • 1970-01-01
    相关资源
    最近更新 更多