Een reeks items kan van klein naar groot gesorteerd worden met een techniek die geïnspireerd is op het kaartspel Patience1. Het sorteren gebeurt in twee stappen. Eerst worden de items één voor één in een reeks stapels gelegd volgens deze regels:
initieel zijn er geen stapels
het eerste item vormt een nieuwe stapel die enkel uit dat item bestaat
elk volgende item $$i$$ wordt bovenop de meest linkse stapel gelegd waarvan het bovenste item groter of gelijk is aan item $$i$$; als alle bovenste items kleiner zijn dan item $$i$$ dan wordt er rechts van de bestaande stapels een nieuwe stapel gevormd die enkel bestaat uit item $$i$$
Als alle items in een stapel gelegd zijn dan worden de items van klein naar groot gesorteerd door telkens het kleinste zichtbare item te kiezen. Hierbij liggen de zichtbare items bovenaan de stapels.
Stel bijvoorbeeld dat we aan de hand van deze techniek de reeks getallen (4 3 9 1 5 2 7 8 6) willen sorteren. De eerste stapel wordt gevormd door de getallen 4 en 3. Omdat 9 groter is dan 3, maken we voor 9 een tweede stapel. Daarna gaat 1 bovenop de eerste stapel, en gaan 5 en 2 bovenop de tweede stapel. Op dit punt bestaat de eerste stapel van boven naar beneden uit (1 3 4), de tweede stapel uit (2 5 9) en de resterende items uit (7 8 6). Nu gaat 7 op een derde stapel, 8 op een vierde stapel, en 6 gaat bovenop 7 in de derde stapel. Nu alle items in stapels gelegd zijn, wordt 1 verwijderd van de eerste stapel, 2 van de tweede stapel, 3 en 4 van de eerste stapel, 5 van de tweede stapel, 6 en 7 van de derde stapel, 8 van de vierde stapel en 9 van de tweede stapel.
Een item wordt voorgesteld door een geheel getal (Number). Een stapel items wordt voorgesteld als een array (Array) waarvan het eerste element correspondeert met het bovenste item van de stapel en het laatste element met het onderste item van de stapel. Een reeks stapels die naast elkaar liggen wordt voorgesteld als een array (Array) waarvan het eerste element correspondeert met de stapel uiterst links en het laatste element met de stapel uiterst rechts.
Definieer een klasse PatienceSorteerder die kan gebruikt worden om een reeks items van klein naar groot te sorteren op basis van de techniek die geïnspireerd is op het kaartspel Patience. Bij het aanmaken van een object van de klasse PatienceSorteerder liggen er nog geen items in stapels. De klasse moet minstens de volgende methoden ondersteunen:
Een methode stapels waaraan geen argumenten moeten doorgegeven worden. De methode moet teruggeven welke stapels (Array) er momenteel zijn.
Een methode aantalStapels waaraan geen argumenten moeten doorgegeven worden. De methode moet teruggeven hoeveel stapels (Number) er momenteel zijn.
Een methode aantalItems waaraan geen argumenten moeten doorgegeven worden. De methode moet teruggeven hoeveel items (Number) er momenteel op alle stapels samen liggen.
Een methode itemToevoegen waaraan een item moet doorgegeven worden. Het gegeven item moet bovenop een (bestaande of nieuwe) stapel gelegd worden volgens de regels van de sorteertechniek die geïnspireerd is op het kaartspel Patience. De methode moet een verwijzing teruggeven naar het object waarop de methode werd aangeroepen.
Een methode itemsToevoegen waaraan een array (Array) met items moet doorgegeven worden. De methode moet alle items uit de gegeven array één voor één bovenop een (bestaande of nieuwe) stapel leggen, volgens de regels van de sorteertechniek die geïnspireerd is op het kaartspel Patience. De methode moet een verwijzing teruggeven naar het object waarop de methode werd aangeroepen.
Een methode itemVerwijderen waaraan geen argumenten moeten doorgegeven worden. Als er geen items meer zijn dan moet de methode een AssertionError opwerpen met de boodschap geen items meer. Anders moet de methode het kleinste zichtbare item van de stapels verwijderen. Als het kleinste zichtbare item bovenop meerdere stapels ligt, dan moet de methode het item verwijderen uit de meest linkse van die stapels. Als het verwijderde item het laatste item was dat in de stapel lag, dan moet ook de stapel uit de reeks stapels verwijderd worden. De methode moet het verwijderde item (Number) teruggeven.
Een methode itemsVerwijderen waaraan geen argumenten moeten doorgegeven worden. De methode moet telkens het kleinste zichtbare item van de stapels verwijderen zoals dat bij de methode itemVerwijderen gebeurt, totdat er geen items meer overblijven. De methode moet een array (Array) teruggeven met de items (Number) in de volgorde waarin ze verwijderd werden.
> let sorteerder = new PatienceSorteerder();
> sorteerder.stapels()
[]
> sorteerder.aantalStapels()
0
> sorteerder.aantalItems()
0
> sorteerder.itemToevoegen(4).stapels()
[[4]]
> sorteerder.aantalStapels()
1
> sorteerder.itemToevoegen(3).stapels()
[[3, 4]]
> sorteerder.itemToevoegen(9).stapels()
[[3, 4], [9]]
> sorteerder.aantalStapels()
2
> sorteerder.itemToevoegen(1).stapels()
[[1, 3, 4], [9]]
> sorteerder.itemToevoegen(5).stapels()
[[1, 3, 4], [5, 9]]
> sorteerder.itemToevoegen(2).stapels()
[[1, 3, 4], [2, 5, 9]]
> sorteerder.itemToevoegen(7).stapels()
[[1, 3, 4], [2, 5, 9], [7]]
> sorteerder.aantalStapels()
3
> sorteerder.itemToevoegen(8).stapels()
[[1, 3, 4], [2, 5, 9], [7], [8]]
> sorteerder.itemToevoegen(6).stapels()
[[1, 3, 4], [2, 5, 9], [6, 7], [8]]
> sorteerder.aantalStapels()
4
> sorteerder.aantalItems()
9
> sorteerder.itemVerwijderen()
1
> sorteerder.stapels()
[[3, 4], [2, 5, 9], [6, 7], [8]]
> sorteerder.itemVerwijderen()
2
> sorteerder.stapels()
[[3, 4], [5, 9], [6, 7], [8]]
> sorteerder.itemVerwijderen()
3
> sorteerder.stapels()
[[4], [5, 9], [6, 7], [8]]
> sorteerder.itemVerwijderen()
4
> sorteerder.stapels()
[[5, 9], [6, 7], [8]]
> sorteerder.aantalStapels()
3
> sorteerder.itemVerwijderen()
5
> sorteerder.stapels()
[[9], [6, 7], [8]]
> sorteerder.itemVerwijderen()
6
> sorteerder.stapels()
[[9], [7], [8]]
> sorteerder.itemVerwijderen()
7
> sorteerder.stapels()
[[9], [8]]
> sorteerder.itemVerwijderen()
8
> sorteerder.stapels()
[[9]]
> sorteerder.itemVerwijderen()
9
> sorteerder.stapels()
[]
> sorteerder.aantalStapels()
0
> sorteerder.aantalItems()
0
> sorteerder.itemVerwijderen()
AssertionError: geen items meer
> sorteerder = new PatienceSorteerder();
> sorteerder.itemsToevoegen([7, 5, 2, 1, 8, 6, 3, 9, 4]).stapels()
[[1, 2, 5, 7], [3, 6, 8], [4, 9]]
> sorteerder.aantalStapels()
3
> sorteerder.aantalItems()
9
> sorteerder.itemsVerwijderen()
(1, 2, 3, 4, 5, 6, 7, 8, 9)
> sorteerder.stapels()
[]
> sorteerder.aantalStapels()
0
> sorteerder.aantalItems()
0
> sorteerder.itemVerwijderen()
AssertionError: geen items meer
Burstein A, Lankham I (2006). Combinatorics of patience sorting piles. Séminaire Lotharingien de Combinatoire 54, B54Ab. 2
Chandramouli B, Goldstein J (2014). Patience is a virtue: revisiting merge and sort on modern processors. Proceedings of the 2014 ACM SIGMOD international conference on Management of data, 731–742. 3
Mallows C (1973). Patience sorting. Bulletin of the Institute of Mathematics and its Applications 9, 216–224.