【问题标题】:Sort an array of doubles and return the sorted array of original indices [duplicate]对双精度数组进行排序并返回原始索引的排序数组[重复]
【发布时间】:2019-04-27 23:38:33
【问题描述】:

我想对一个双精度数组进行排序,但我想保存原始索引。我已经尝试了以下 -

double[] circs = new double[noOfCircs];

用值初始化 circs...

int[] loc = Enumerable.Range(0, noOfCircs-1).ToArray();
Array.Sort(circs, loc);

排序后,我想使用数组 loc 进行进一步的计算。 我做错了什么?

【问题讨论】:

  • 排序数组是数组中值位置的变化,这意味着索引会改变。要保存以前的位置,您将需要不同的集合来存储值和原始索引。
  • 我正在使用不同的数组来存储索引。上面共享代码中的数组'loc'用于存储索引值。
  • 仅供我理解。你有 double[] 和你想要排序的值。但是您不想更改原始数组,因此您试图以排序方式将原始数组的索引保存到 int[] ?您是否尝试过创建原始数组的已排序 double[] 数组副本,遍历新数组,找到旧数组中的值并将其索引保存到 loc 数组?
  • var result = circs.Select((s,i) => new { Value = s, Index = i }).OrderBy(o => o.Value); 这将返回匿名对象的有序集合 (IOrderedEnumerable),您可以根据需要使用它。这就是你想要的吗?
  • 你想达到什么目的? Sort method would be faster than iterating through the lot of them 你这是什么意思?请编辑您的问题,添加详细信息您想做什么、您做了什么、出了什么问题以及预期的结果是什么。

标签: c# asp.net .net sorting quicksort


【解决方案1】:

我建议 Linq 借助 匿名类

using System.Linq;

...

double[] circs = ...

int[] loc = circs
  .Select((value, index) => new { // for each item we store
     value = value,               //   its value
     index = index                //   and original index
   })
  .OrderBy(pair => pair.value)  // Order by values
  .Select(pair => pair.index)   // By return original index
  .ToArray();

【讨论】:

  • 在此解决方案与匿名类型和 C# 7 值元组之间进行性能比较会很有趣。值元组将复制更多内存但具有更好的局部性(并产生较小的收集压力),因此如果不尝试就很难说哪个会更好。
【解决方案2】:

您可以将双精度数组转换为列表,然后对列表进行排序。这样你仍然会拥有原来的双精度数组。

 List<double> list = doubleArray.ToList();
 list.Sort();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-07-12
    • 1970-01-01
    • 1970-01-01
    • 2014-11-06
    • 1970-01-01
    • 2016-08-24
    • 1970-01-01
    相关资源
    最近更新 更多