我有一组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};
有谁知道什么是移动元素从原始生成排序数组的最佳方法?
这个数组依旧绑定到另一个数组,该数组没有以相同方式按大小排序的元素,并且必须以与原始相同的方式移位,因此数组不应按大小排序,必须转移。
答案 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);
答案 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}。