Ответы Джона Скита и Марка Гравелла ♦ дают правильное решение, но если вы не хотите выделять дополнительный массив, вы можете:
а) решить конкретную проблему (перенести 2-ю половину на 1-ю половину):
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;
}
}
Обратите внимание, что этот код не может работать с массивом с нечетным числом элементов.
б) вы можете применить алгоритм векторного смещения, который я знаю из «Жемчуга программирования» Джона Бентли:
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}.