Ввести одномерный массив A, вывести его. Произвести циклический сдвиг элементов расположенных вне границ - C#
Формулировка задачи:
Помогите пожалуйста с задачей:
Ввести одномерный массив A, вывести его. Произвести циклический сдвиг элементов расположенных вне границ между максимумом и минимумом вправо (элементы между максимумом и минимумом остаются на своих местах).
Решение задачи: «Ввести одномерный массив A, вывести его. Произвести циклический сдвиг элементов расположенных вне границ»
textual
Листинг программы
- public class Program
- {
- // Поиск индекса минимального элемента
- private static int GetMinIndex(int[] array)
- {
- int minIndex = 0;
- for (int i = 1; i < array.Length; i++)
- if (array[i] < array[minIndex])
- minIndex = i;
- return minIndex;
- }
- // Поиск индекса максимального элемента
- private static int GetMaxIndex(int[] array)
- {
- int maxIndex = 0;
- for (int i = 1; i < array.Length; i++)
- if (array[i] > array[maxIndex])
- maxIndex = i;
- return maxIndex;
- }
- // Обмен значений элементов
- private static void Swap(ref int x, ref int y)
- {
- var temp = x;
- x = y;
- y = temp;
- }
- // Зная текущий индекс (index), длину массива (length), и диапазон
- // игнорируемых элементов [minIndex; maxIndex], опредеяем индекс предыдущего элемента.
- private static int GetPreviousIndex(int index, int length, int minIndex, int maxIndex)
- {
- if (index == (maxIndex + 1) % length) // если предыдущий элемент имеет индекс maxIndex
- index = minIndex - 1;
- else
- index = index - 1;
- if (index == -1) // это например на случай если изначальный index (или minIndex) был равен нулю.
- index = length - 1;
- return index;
- }
- private static void ShiftRight(int[] array)
- {
- int minIndex = GetMinIndex(array);
- int maxIndex = GetMaxIndex(array);
- if (maxIndex - minIndex + 1 >= array.Length - 1)
- return;
- if (minIndex > maxIndex)
- Swap(ref minIndex, ref maxIndex); // хотим, чтобы minIndex <= maxIndex
- // находим любой индекс, не входящий в диапазон [minIndex, maxIndex]
- // в данном случае определяем его как предыдущи элемент от элемента minIndex
- int startIndex = GetPreviousIndex(minIndex, array.Length, minIndex, maxIndex);
- // запоминаем его, потому что он будет перезаписан на первой итерации цикла
- int startElement = array[startIndex];
- // текущий индекс
- int index = startIndex;
- // (maxIndex - minIndex + 1) - размер отрезка [minIndex; maxIndex]
- // array.Length - (maxIndex - minIndex + 1) - количество сдвигов которые необходимо совершить
- // вычитаем единицу, така как последний двиг особенный
- for (int k = 0; k < array.Length - (maxIndex - minIndex + 1) - 1; k++)
- {
- // определяем индекс предыдущего элемента
- int previousIndex = GetPreviousIndex(index, array.Length, minIndex, maxIndex);
- // совершаем сдвиг, перезаписывая текущий элемент предыдущим
- array[index] = array[previousIndex];
- // следующий индекс, значение по которому надо перезаписать.
- index = previousIndex;
- }
- // совершаем заключающий сдвиг. Нельзя использовать GetPreviousIndex(index, ....), така как тот элемент
- // был перезаписан, а нам нужно его оригинальное значение. Это значение startElement.
- array[index] = startElement;
- }
- public static void Main(string[] args)
- {
- int[] array = { 1, 3, 1, 4, 5, 10, 6, 7, 8 };
- Console.WriteLine(string.Join(", ", array));
- ShiftRight(array);
- Console.WriteLine(string.Join(", ", array));
- }
- }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д