如何移动数组元素

时间:2009-04-19 18:36:18

标签: .net arrays shift

我有一组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};

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

这个数组依旧绑定到另一个数组,该数组没有以相同方式按大小排序的元素,并且必须以与原始相同的方式移位,因此数组不应按大小排序,必须转移

7 个答案:

答案 0 :(得分: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);

答案 1 :(得分:3)

鉴于问题的严格性,Array.Copy

        int half = original.Length / 2;
        Array.Copy(original, 0, sorted, half, half);
        Array.Copy(original, half, sorted, 0, half);

答案 2 :(得分:2)

在Linq怎么样:

int half = original.Length/2;
var sorted = original.Skip(half).Concat(original.Take(half)).ToArray();

答案 3 :(得分:0)

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

答案 4 :(得分:0)

你试过了吗?

Array.Sort(original);

答案 5 :(得分:0)

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

Array.Sort(keys, values);

以下是文档Array.Sort(Array keys, Array items)

答案 6 :(得分: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&#39; Programming Pearls&#39;中了解的向量移位算法:

 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.此代码处理奇数个项目,索引不在中间。使用类似于本书中使用的示例to toRotate = {0,1,2,3,4,5,6,7}和index = 3 Rotate2 将产生{3,4, 5,6,7,0,1,2}。