Search
Jeroným začal studovat řadící algoritmy a řekl si, že by je bylo dobré otestovat na dlouhých posloupnostech – zda to, co říká teorie, opravdu v praxi platí. Zkonstruoval generátor posloupností, který generoval posloupnosti délky tisíc až milion prvků a současně dokázal vymezit vlastnosti vygenerované posloupnosti (maximum prvků a případně typ řazení).
Když Jeroným zkoušel svůj generátor, přišel na to, že jej napadl virus a generované posloupnosti měnily svoje vlastnosti. Virus způsoboval, že asi 10% prvků posloupnosti měnilo svoji pozici v posloupnosti o nejvýše 16 míst (index prvku se zmenšil / zvětšil o maximálně 16). Jeroným takové posloupnosti bedlivě označoval.
Pomozte Jeronýmovi vytvořit program, který dokáže co nejrychleji a nejefektivněji řadit posloupnosti celých čísel generovaných generátorem.
Na vstupu je posloupnost čísel. První řádek obsahuje hlavičku – 3 čísla oddělená mezerou a popisující vlastnosti posloupnosti:
1
2
0
Na vstupu dále následují prvky posloupnosti – kladná celá čísla do maximální hodnoty 2147483647 (maximální hodnota proměnné typu int – 32-bitová reprezentace). Každé číslo je v souboru zapsané na novém řádku. Maximální počet prvků na vstupu je omezen na milion.
2147483647
Výstupem je posloupnost čísel seřazená vzestupně, jednotlivá čísla jsou odřádkována. Rozhodující je efektivita řazení posloupnosti.
Vstupní soubor kompletně načtěte. Zkontrolujte, zda vygenerovaná posloupnost odpovídá zadání. Kontrola vstupu a případné vypsání chyby musí být provedeno v následujícím pořadí:
Error: Maximum neni kladne!
Error: Neznamy typ razeni posloupnosti!
Error: Nelze urcit, zda posloupnost napadl virus!
Error: Prvek posloupnosti je mimo rozsah!
Error: Posloupnost neni usporadana!
Error: Posloupnost ma mene nez 1000 prvku!
Error: Posloupnost ma vic nez 1000000 prvku!
Detekovanou chybu na chybovém výstupu vypište a program ukončete. Vypsané chybové hlášení je ukončeno koncem řádku (znakem \n).
\n
Při návrhu časově optimálního algoritmu je potřeba vzít v úvahu možné typy posloupnosti – zda jsou již správně seřazené, či jsou řazené sestupně, zda jsou napadeny virem, či zda je omezeno maximum prvků posloupnosti. Tyto vlastnosti posloupností odkazují na optimální algoritmy pro jejich řazení. Implementujte všechny potřebné algoritmy a podle typu posloupnosti aplikujte na dané posloupnosti odpovídající algoritmus.
Opravu posloupnosti při jejím napadení virem lze řešit mnoha způsoby. Hledejte časově optimální z nich. Rozhodně stačí prohledat a uspořádat pouze blízké okolí každého prvku posloupnosti, i když toto okolí může být větší než ±16 prvků.
Při hledání optimálního řešení je potřeba vzít v úvahu i dobu potřebnou pro čtení dat ze vstupu a dobu pro vypsání výsledků. Tuto dobu lze zkrátit využitím vyrovnávací paměti při čtení a zápisu dat.
sort
sorted
qsort
Vyhněte se používání uvedených klíčových slov i ve vlastním kódu programu!!!
BufferedInputStream
BufferedOutputStream
flush
0x0A
'\n'
0x0D 0X0A
Testovací soubory najdete zde.
0 1 0 10 10
10 3 2 10 5 1
10 0 2 10 5 1
10 0 0 11 0 5 1
10 2 0 10 1 5 1
10 0 0 10 1 5 1
9909 1 0 14 33 51 52 70 … seřazená posloupnost 1000 prvků
14 33 51 52 70 … Seřazená posloupnost ze vstupu
10 0 0 5 1 8 … neseřazená posloupnost 1000 prvků
1 1 1 1 … Seřazená posloupnost na vstupu
Dále jsou posloupnosti generovány náhodně podle daných charakteristik.
Příklad 9 – sort_2_01
Vstup: Posloupnost 10000 prvků seřazená sestupně
Příklad 10 – sort_2_02
Vstup: Posloupnost 10000 prvků seřazená vzestupně a napadena virem
Příklad 11 – sort_2_03
Vstup: Posloupnost 10000 prvků seřazená sestupně a napadena virem
Příklad 12 – sort_2_04
Vstup: Neseřazená posloupnost 10000 prvků napadena virem
Příklad 13 – sort_2_05
Vstup: Neseřazená posloupnost 10000 prvků
Příklad 14 – sort_2_06
Vstup: Neseřazená posloupnost 10000 prvků, čísla jsou v rozmezí 1 až 100
Příklad 15 – sort_2_07
Vstup: Neseřazená posloupnost 100000 prvků
Příklad 16 – sort_2_08
Vstup: Neseřazená posloupnost 100000 prvků, čísla jsou v rozmezí 1 až 1000
Příklad 17 – sort_2_09
Vstup: Posloupnost 100000 prvků seřazená sestupně a napadena virem
Java
Python
C/C++
Veřejné testovací soubory - DSA_HW02.
sort.py
Sort.java
sort.c
sort.cpp
clang -Wall -Werror -pedantic -std=c99 clang -Wall -Werror -pedantic -std=c+ +17
javac *.java java -classpath Sort
řadící algoritmy složitost řadících algoritmů
20