Учитывая список целых чисел, единственная операция, которая может быть сделана в списке, состоит в обращении подсписка списка. В: Какова минимальная операция для сортировки списка?
Например,
Для 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;
}
Как вычислить временную сложность функции? Как это улучшить?