Ввести одномерный массив A, вывести его. Произвести циклический сдвиг элементов расположенных вне границ - C#

Узнай цену своей работы

Формулировка задачи:

Помогите пожалуйста с задачей: Ввести одномерный массив A, вывести его. Произвести циклический сдвиг элементов расположенных вне границ между максимумом и минимумом вправо (элементы между максимумом и минимумом остаются на своих местах).

Решение задачи: «Ввести одномерный массив A, вывести его. Произвести циклический сдвиг элементов расположенных вне границ»

textual
Листинг программы
  1. public class Program
  2. {
  3.     // Поиск индекса минимального элемента
  4.     private static int GetMinIndex(int[] array)
  5.     {
  6.         int minIndex = 0;
  7.         for (int i = 1; i < array.Length; i++)
  8.             if (array[i] < array[minIndex])
  9.                 minIndex = i;
  10.         return minIndex;
  11.     }
  12.    
  13.     // Поиск индекса максимального элемента
  14.     private static int GetMaxIndex(int[] array)
  15.     {
  16.         int maxIndex = 0;
  17.         for (int i = 1; i < array.Length; i++)
  18.             if (array[i] > array[maxIndex])
  19.                 maxIndex = i;
  20.         return maxIndex;
  21.     }
  22.    
  23.     // Обмен значений элементов
  24.     private static void Swap(ref int x, ref int y)
  25.     {
  26.         var temp = x;
  27.         x = y;
  28.         y = temp;
  29.     }
  30.    
  31.     // Зная текущий индекс (index), длину массива (length), и диапазон
  32.     // игнорируемых элементов [minIndex; maxIndex], опредеяем индекс предыдущего элемента.
  33.     private static int GetPreviousIndex(int index, int length, int minIndex, int maxIndex)
  34.     {
  35.         if (index == (maxIndex + 1) % length) // если предыдущий элемент имеет индекс maxIndex
  36.             index = minIndex - 1;
  37.         else
  38.             index = index - 1;
  39.            
  40.         if (index == -1) // это например на случай если изначальный index (или minIndex) был равен нулю.
  41.             index = length - 1;
  42.            
  43.         return index;
  44.     }
  45.  
  46.     private static void ShiftRight(int[] array)
  47.     {
  48.         int minIndex = GetMinIndex(array);
  49.         int maxIndex = GetMaxIndex(array);
  50.         if (maxIndex - minIndex + 1 >= array.Length - 1)
  51.             return;
  52.         if (minIndex > maxIndex)
  53.             Swap(ref minIndex, ref maxIndex); // хотим, чтобы minIndex <= maxIndex
  54.            
  55.         // находим любой индекс, не входящий в диапазон [minIndex, maxIndex]
  56.         // в данном случае определяем его как предыдущи элемент от элемента minIndex
  57.         int startIndex = GetPreviousIndex(minIndex, array.Length, minIndex, maxIndex);
  58.        
  59.         // запоминаем его, потому что он будет перезаписан на первой итерации цикла
  60.         int startElement = array[startIndex];
  61.        
  62.         // текущий индекс
  63.         int index = startIndex;
  64.        
  65.         // (maxIndex - minIndex + 1) - размер отрезка [minIndex; maxIndex]
  66.         // array.Length - (maxIndex - minIndex + 1) - количество сдвигов которые необходимо совершить
  67.         // вычитаем единицу, така как последний двиг особенный
  68.         for (int k = 0; k < array.Length - (maxIndex - minIndex + 1) - 1; k++)
  69.         {
  70.             // определяем индекс предыдущего элемента
  71.             int previousIndex = GetPreviousIndex(index, array.Length, minIndex, maxIndex);
  72.            
  73.             // совершаем сдвиг, перезаписывая текущий элемент предыдущим
  74.             array[index] = array[previousIndex];
  75.            
  76.             // следующий индекс, значение по которому надо перезаписать.
  77.             index = previousIndex;
  78.         }
  79.        
  80.         // совершаем заключающий сдвиг. Нельзя использовать GetPreviousIndex(index, ....), така как тот элемент
  81.         // был перезаписан, а нам нужно его оригинальное значение. Это значение startElement.
  82.         array[index] = startElement;
  83.     }
  84.  
  85.     public static void Main(string[] args)
  86.     {
  87.         int[] array = { 1, 3, 1, 4, 5, 10, 6, 7, 8 };
  88.         Console.WriteLine(string.Join(", ", array));
  89.         ShiftRight(array);
  90.         Console.WriteLine(string.Join(", ", array));
  91.     }
  92. }

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

5   голосов , оценка 4.2 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы