1

我有一个 n = 32 项的数组,其中包含正值和负值。第一个 n/2 元素是正数并按值排序,第二个 n/2 元素是负数并按值排序。我想按值对整个数组进行排序,从最小的负值到最大的正值,这意味着如果有 32 个元素,则前 16 个(n/2)排序元素应包含原始数组的后 16 个元素的值排序数组的后 16 个元素应包含原始数组的前 16 个值。

假设示例:

double[] original = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, -16, -15, ..., -1};

double[] sorted = {-16, -15, ...., -1, 1, 2, ..., 16};

有谁知道将元素转换为从原始生成排序数组的最佳方法是什么?

顺便说一下,这个数组与另一个数组相关联,该数组没有按大小排序的元素相同的方式,并且必须以与原始相同的方式移动,因此数组不应该按大小排序,它必须被移动

4

7 回答 7

9

因此,您想要第二个数组,其中包含原始内容但位置已移动?要么明确地做到这一点:

double[] result = new double[32];
for (int i=0; i < 32; i++)
{
    result[(i+16)%32] = original[i];
}

或使用Array.Copy两次:

double[] result = new double[32];
Array.Copy(original, 0, result, 16, 16);
Array.Copy(original, 16, result, 0, 16);
于 2009-04-19T18:44:52.580 回答
3

鉴于问题的刚性性质,Array.Copy

        int half = original.Length / 2;
        Array.Copy(original, 0, sorted, half, half);
        Array.Copy(original, half, sorted, 0, half);
于 2009-04-19T19:07:19.343 回答
2

在Linq怎么样:

int half = original.Length/2;
var sorted = original.Skip(half).Concat(original.Take(half)).ToArray();
于 2009-04-19T18:58:08.413 回答
0

只需对元素 0 和元素 16、1 和 17、2 和 18 等进行交换即可。

于 2009-04-19T18:38:06.793 回答
0

你有没有尝试过:

Array.Sort(original);
于 2009-04-19T18:40:43.590 回答
0

您想根据另一个相同大小的数组中包含的值对一个数组进行排序吗?如果是这样,请使用以下内容:

Array.Sort(keys, values);

这是文档Array.Sort(Array keys, Array items)

于 2009-04-19T19:02:19.340 回答
0

Jon Skeet 和 Marc Gravell♦ 的答案提供了正确的解决方案,但如果您不想分配额外的数组,您可以:

a)解决您的具体问题(将第二半移到第一半之前):

private void Rotate1(double[] toRotate ) {
        int startOf2nd = toRotate.Length / 2;
        for (int i=0; i < toRotate.Length/2; i++) {
            double temp = toRotate [i];
            toRotate [i] = toRotate [i + startOf2nd];
            toRotate [i + startOf2nd] = temp;
        }
    }

请注意,此代码无法处理包含奇数项的数组。

b)您可以应用我从 Jon Bentley 的“Programming Pearls”中知道的矢量移位算法:

 private void Rotate2(double[] toRotate, int index ) {
        Array.Reverse(toRotate, 0, index);
        Array.Reverse(toRotate, index, toRotate.Length-index);
        Array.Reverse(toRotate, 0, toRotate.Length);
    }

在您的示例中,索引为 16。此代码处理奇数个项目,并且索引不在中间。使用类似于书中使用的示例 toRotate={0,1,2,3,4,5,6,7} 和 index = 3 Rotate2将产生 {3,4,5,6,7,0 ,1,2}。

于 2013-04-17T16:04:23.987 回答