algorithm
Sortuj naleśniki
Szukaj…
Podstawowe informacje na temat sortowania naleśników
Sortowanie naleśników jest potocznym określeniem matematycznego problemu sortowania nieuporządkowanego stosu naleśników według wielkości, gdy szpachelka może być włożona w dowolnym punkcie stosu i używana do przewracania wszystkich naleśników nad nim. Liczba naleśników to minimalna liczba przewrotek wymagana dla danej liczby naleśników.
W przeciwieństwie do tradycyjnego algorytmu sortowania, który próbuje sortować przy możliwie najmniejszej liczbie porównań, celem jest posortowanie sekwencji w jak najmniejszej liczbie odwróceń.
Chodzi o to, aby zrobić coś podobnego do Sortowania selekcji. Jeden po drugim umieszczamy maksymalny element na końcu i zmniejszamy rozmiar bieżącej tablicy o jeden.
Analiza problemu:
- Konieczność zamówienia naleśników od najmniejszej (górnej) do największej (dolnej), stos początkowy można ułożyć w dowolnej kolejności.
- Mogę tylko wykonać przerzucenie całego stosu.
- Aby przerzucić konkretny naleśnik na spód stosu, musimy najpierw przewrócić go na górę (a następnie ponownie na dół).
- Aby zamówić każdy naleśnik, konieczne będzie jedno przewrócenie w górę i jedno przewrócenie w dół do jego ostatecznego położenia.
Intuicyjny algorytm:
Znajdź największy niedziałający naleśnik i przewróć go na dół (być może najpierw będziesz musiał przerzucić go na górę stosu).
Powtarzaj krok pierwszy, aż stos zostanie uporządkowany.
To wszystko, algorytm dwuetapowy będzie działał.
Przykład algorytmu sortowania Pancake:
Przestrzeń pomocnicza: O(1)
Złożoność czasu: O(n^2)
Implementacja C #
public class PancakeSort
{
private static void SortPancake(int[] input, int n)
{
for (var bottom = n - 1; bottom > 0; bottom--)
{
var index = bottom;
var maxIndex = input[bottom];
int i;
for (i = bottom - 1; i >= 0; i--)
{
if (input[i] > maxIndex)
{
maxIndex = input[i];
index = i;
}
}
if (index == bottom) continue;
var temp = new int[n];
var j = 0;
for (i = bottom; i > index; i--,j++)
{
temp[j] = input[i];
}
for (i = 0; i < index; i++, j++)
{
temp[j] = input[i];
}
if (temp.Length > j) temp[j] = input[index];
for (i = 0; i <= bottom; i++)
{
input[i] = temp[i];
}
}
}
public static int[] Main(int[] input)
{
SortPancake(input, input.Length);
return input;
}
}