Сортировка массива путем обращения только подстрок, найти минимальные шаги - PullRequest
0 голосов
/ 30 апреля 2020

Учитывая список целых чисел, единственная операция, которая может быть сделана в списке, состоит в обращении подсписка списка. В: Какова минимальная операция для сортировки списка?

Например,

Для 3, 2, 1 это 1, поскольку необходим только один разворот во всем списке. Для 3, 1, 2 - 2. Сначала обратный ход (1, 2), поэтому список становится (3, 2, 1). Затем переверните весь список.

Я пробовал следующий код C#, но он не работает.

FindMin(arr, 0);
// return minSteps;

static int minSteps = int.MaxValue;
static HashSet<(int i0, int i1, int i2, int i3, int i4, int i5, int i6, int i7)> tried = 
    new HashSet<(int i0, int i1, int i2, int i3, int i4, int i5, int i6, int i7)>();

static void FindMin(int[] arr, int level)
{
    if (IsAscending(arr)) 
    {
        minSteps = Math.Min(minSteps, level);
        return;
    }
    var x = (GetItem(arr, 0), GetItem(arr, 1), GetItem(arr, 2), GetItem(arr, 3), GetItem(arr, 4), GetItem(arr, 5), GetItem(arr, 6), GetItem(arr, 7));
    if (tried.Contains(x)) return;
    tried.Add(x);
    for (int i = 0; i < arr.Length; i++)
    {
        for (int j = i + 2; j < arr.Length + 1; j++)
        {
            var l = arr[0..i].Concat(arr[i..j].Reverse()).Concat(arr[j..]).ToArray();
            FindMin(l, level + 1);
        }
    }
}

static int GetItem(int[] arr, int i)
{
    return (arr.Length > i) ? arr[i] : 0;
}

private static bool IsAscending(int[] arr)
{
    var pre = arr[0];
    for (var i = 1; i < arr.Length; i++)
    {
        if (arr[i] < pre) return false;
        pre = arr[i];
    }
    return true;
}

Как вычислить временную сложность функции? Как это улучшить?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...