Определить минимальное количество перестановок, нужных для упорядочивания последовательности - 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
Листинг программы
using System;
using System.Collections.Generic;
 
namespace ConsoleApp1
{
    class Program
    {
        static int MinReplaces(int[] a)
        {
            int[] aux = new int[a.Length + 1];
 
            for (int i = 0; i < a.Length; ++i)
            {
                int j = a[i];
                int val = aux[j] + 1;
 
                while (j < aux.Length && val > aux[j])
                    aux[j++] = val;
            }
 
            return a.Length - aux[aux.Length - 1];
        }
 
        static void Main()
        {
            List<int[]> list = new List<int[]>();
            list.Add(new int[] { 1, 2, 3 }); // 0
            list.Add(new int[] { 3, 2, 1 }); // 2
            list.Add(new int[] { 1, 2, 4, 3 }); // 1 
            list.Add(new int[] { 2, 3, 4, 1 }); // 1
            list.Add(new int[] { 4, 1, 2, 3 }); // 1
            list.Add(new int[] { 1, 2, 4, 5, 3 }); // 1
            list.Add(new int[] { 1, 3, 2, 4, 6, 5 }); // 2
            list.Add(new int[] { 1, 6, 3, 4, 5, 2 }); // 2
            list.Add(new int[] { 6, 4, 1, 3, 2, 5 }); // 3
            list.Add(new int[] { 3, 5, 6, 4, 2, 1 }); // 3
            list.Add(new int[] { 4, 1, 3, 2, 5, 6 }); // 2
            list.Add(new int[] { 3, 6, 4, 5, 2, 1 }); // 3
            list.Add(new int[] { 4, 5, 6, 7, 1, 2, 3 }); // 3
            list.Add(new int[] { 1, 2, 9, 3, 8, 4, 5, 6, 7 }); // 2
            list.Add(new int[] { 10, 1, 6, 7, 2, 4, 8, 9, 5, 3 }); // 5
 
            foreach (int[] a in list)
                Console.WriteLine("{0} ({1})", String.Join(" ", a), MinReplaces(a));
        }
    }
}

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


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

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

15   голосов , оценка 3.733 из 5
Похожие ответы