题
我具有N = 32个项目与正和负值的数组。第一n / 2个元素为正,而由值和第二n / 2个元素排序为负,而由值进行排序,以及。我想通过值整个数组进行排序,从最小的负值最大正值,这意味着如果存在的前16个(N / 2)来分类的元件应包含的原始阵列的第二16个元素的值32个元件开始和排序阵列的第二的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};
有谁知道什么是转移的元素,以产生从原始的排序后的数组的最佳方式?
此数组是通过连结到另一个阵列不具有按大小排序以同样的方式的元件和具有要被移动相同的方式原来以使阵列不应由大小进行排序的方式,请它已被移位强>
解决方案
所以,你想第二阵列,与原来的,但在位置上的内容转移?任一这样做明确地:
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);
其他提示
鉴于这个问题的刚性性质
,Array.Copy
:
int half = original.Length / 2;
Array.Copy(original, 0, sorted, half, half);
Array.Copy(original, half, sorted, 0, half);
如何在LINQ的:
int half = original.Length/2;
var sorted = original.Skip(half).Concat(original.Take(half)).ToArray();
你试过:
Array.Sort(original);
只要做元素0和元件16 1和17,图2和18 ..等上的交换。
乔恩斯基特的和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)中可以应用矢量移算法我知道从乔恩Bentley的“编程珍珠”:
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}和索引= 3的 Rotate2 会产生{3,4-使用的一个例子, 5,6,7,0,1,2}。
不隶属于 StackOverflow