Определить минимальное количество перестановок, нужных для упорядочивания последовательности - C#

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

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

Есть перемешанная последовательность чисел от 1 до n. Нужно определить минимальное количество перестановок, которые нужно сделать, чтобы все числа были на своих местах. Одна перестановка - это взять число с одного места и переставить его на другое (то, что для этого нужно будет двигать другие числа не учитывается). Нашел такой способ решения, но он не всегда работает правильно. Например: если взять 1243, получаем 1-1, 2-2, 3-4-3 то есть нужно 3-е число поставить на место 4-го, а четвёртое, в свою очередь, на место 3-го. И здесь всё правильно, но если взять 4123, получаем 1-4-3-2-1 то есть 4 перестановки, хотя хватило бы и одной (самой первой. четвёрку поставить в конец). Или ещё хуже. Возьмём 12453. Получаем 1-1, 2-2, 3-4-5-3 То есть, нужно сделать 3 перестановки, хотя опять же хватило бы и одно, но на этот раз её вообще нет в списке. (переставить тройку на место после двойки). Так что этот способ не работает. Пожалуйста, можете подсказать работающий алгоритм?

Решение задачи: «Определить минимальное количество перестановок, нужных для упорядочивания последовательности»

textual
Листинг программы
  1. using System;
  2. using System.Collections.Generic;
  3.  
  4. namespace ConsoleApp1
  5. {
  6.     class Program
  7.     {
  8.         static int MinReplaces(int[] a)
  9.         {
  10.             int[] aux = new int[a.Length + 1];
  11.  
  12.             for (int i = 0; i < a.Length; ++i)
  13.             {
  14.                 int j = a[i];
  15.                 int val = aux[j] + 1;
  16.  
  17.                 while (j < aux.Length && val > aux[j])
  18.                     aux[j++] = val;
  19.             }
  20.  
  21.             return a.Length - aux[aux.Length - 1];
  22.         }
  23.  
  24.         static void Main()
  25.         {
  26.             List<int[]> list = new List<int[]>();
  27.             list.Add(new int[] { 1, 2, 3 }); // 0
  28.             list.Add(new int[] { 3, 2, 1 }); // 2
  29.             list.Add(new int[] { 1, 2, 4, 3 }); // 1
  30.             list.Add(new int[] { 2, 3, 4, 1 }); // 1
  31.             list.Add(new int[] { 4, 1, 2, 3 }); // 1
  32.             list.Add(new int[] { 1, 2, 4, 5, 3 }); // 1
  33.             list.Add(new int[] { 1, 3, 2, 4, 6, 5 }); // 2
  34.             list.Add(new int[] { 1, 6, 3, 4, 5, 2 }); // 2
  35.             list.Add(new int[] { 6, 4, 1, 3, 2, 5 }); // 3
  36.             list.Add(new int[] { 3, 5, 6, 4, 2, 1 }); // 3
  37.             list.Add(new int[] { 4, 1, 3, 2, 5, 6 }); // 2
  38.             list.Add(new int[] { 3, 6, 4, 5, 2, 1 }); // 3
  39.             list.Add(new int[] { 4, 5, 6, 7, 1, 2, 3 }); // 3
  40.             list.Add(new int[] { 1, 2, 9, 3, 8, 4, 5, 6, 7 }); // 2
  41.             list.Add(new int[] { 10, 1, 6, 7, 2, 4, 8, 9, 5, 3 }); // 5
  42.  
  43.             foreach (int[] a in list)
  44.                 Console.WriteLine("{0} ({1})", String.Join(" ", a), MinReplaces(a));
  45.         }
  46.     }
  47. }

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


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

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

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

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

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

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