Implementacja algorytmu (wersja rekurencyjna)

1. Algorytm znajduje rozwiązanie wykonując 2*(n‑1) porównań (I wersja)

Linia 1. kratka include otwórz nawias ostrokątny iostream zamknij nawias ostrokątny. Linia 2. using namespace std średnik. Linia 4. void min podkreślnik max podkreślnik rek podkreślnik liniowe otwórz nawias okrągły int tab otwórz nawias kwadratowy zamknij nawias kwadratowy przecinek int n przecinek int indeks przecinek int minimum przecinek int maksimum zamknij nawias okrągły otwórz nawias klamrowy. Linia 5. prawy ukośnik prawy ukośnik inicjalizacja przy pierwszym wywołaniu. Linia 6. if otwórz nawias okrągły indeks znak równości znak równości 0 zamknij nawias okrągły otwórz nawias klamrowy. Linia 7. minimum znak równości tab otwórz nawias kwadratowy 0 zamknij nawias kwadratowy średnik. Linia 8. maksimum znak równości tab otwórz nawias kwadratowy 0 zamknij nawias kwadratowy średnik. Linia 9. zamknij nawias klamrowy. Linia 11. prawy ukośnik prawy ukośnik jeśli doszliśmy do końca tablicy. Linia 12. if otwórz nawias okrągły indeks znak równości znak równości n zamknij nawias okrągły otwórz nawias klamrowy. Linia 13. cout otwórz nawias ostrokątny otwórz nawias ostrokątny cudzysłów Minimum dwukropek cudzysłów otwórz nawias ostrokątny otwórz nawias ostrokątny minimum otwórz nawias ostrokątny otwórz nawias ostrokątny endl średnik. Linia 14. cout otwórz nawias ostrokątny otwórz nawias ostrokątny cudzysłów Maksimum dwukropek cudzysłów otwórz nawias ostrokątny otwórz nawias ostrokątny maksimum otwórz nawias ostrokątny otwórz nawias ostrokątny endl średnik. Linia 15. return średnik. Linia 16. zamknij nawias klamrowy. Linia 18. prawy ukośnik prawy ukośnik aktualizacja minimum i maksimum. Linia 19. if otwórz nawias okrągły tab otwórz nawias kwadratowy indeks zamknij nawias kwadratowy otwórz nawias ostrokątny minimum zamknij nawias okrągły otwórz nawias klamrowy. Linia 20. minimum znak równości tab otwórz nawias kwadratowy indeks zamknij nawias kwadratowy średnik. Linia 21. zamknij nawias klamrowy. Linia 22. if otwórz nawias okrągły tab otwórz nawias kwadratowy indeks zamknij nawias kwadratowy zamknij nawias ostrokątny maksimum zamknij nawias okrągły otwórz nawias klamrowy. Linia 23. maksimum znak równości tab otwórz nawias kwadratowy indeks zamknij nawias kwadratowy średnik. Linia 24. zamknij nawias klamrowy. Linia 26. prawy ukośnik prawy ukośnik rekurencyjne przejście do następnego elementu. Linia 27. min podkreślnik max podkreślnik rek podkreślnik liniowe otwórz nawias okrągły tab przecinek n przecinek indeks plus 1 przecinek minimum przecinek maksimum zamknij nawias okrągły średnik. Linia 28. zamknij nawias klamrowy. Linia 30. int main otwórz nawias okrągły zamknij nawias okrągły otwórz nawias klamrowy. Linia 31. const int n znak równości 6 średnik. Linia 32. int tab otwórz nawias kwadratowy n zamknij nawias kwadratowy znak równości otwórz nawias klamrowy minus 2 przecinek 13 przecinek 1 przecinek minus 3 przecinek 7 przecinek 22 zamknij nawias klamrowy średnik. Linia 34. prawy ukośnik prawy ukośnik wartości minimum i maksimum zostaną nadpisane przy indeks znak równości znak równości 0. Linia 35. min podkreślnik max podkreślnik rek podkreślnik liniowe otwórz nawias okrągły tab przecinek n przecinek 0 przecinek 0 przecinek 0 zamknij nawias okrągły średnik. Linia 37. return 0 średnik. Linia 38. zamknij nawias klamrowy.

Jak działa program?

  • Funkcja wywołuje samą siebie dla kolejnego indeksu.

  • Każde wywołanie przetwarza jeden element.

  • Przypadek podstawowy: gdy indeks dojdzie do końca tablicy.

2. Algorytm znajduje rozwiązanie korzystając z efektywniejszego algorytmu min‑max** (II wersja)

Rekurencyjnie: dziel i zwyciężaj - jak to działa?

  • Podziel listę na dwie połowy.

  • Znajdź min i max w lewej połowie.

  • Znajdź min i max w prawej połowie.

  • Połącz wyniki.

Linia 1. kratka include otwórz nawias ostrokątny iostream zamknij nawias ostrokątny. Linia 2. using namespace std średnik. Linia 4. void min podkreślnik max podkreślnik dziel podkreślnik i podkreślnik zwyciezaj otwórz nawias okrągły int tab otwórz nawias kwadratowy zamknij nawias kwadratowy przecinek int lewy przecinek int prawy przecinek int ampersant minimum przecinek int ampersant maksimum zamknij nawias okrągły otwórz nawias klamrowy. Linia 5. prawy ukośnik prawy ukośnik jeden element. Linia 6. if otwórz nawias okrągły lewy znak równości znak równości prawy zamknij nawias okrągły otwórz nawias klamrowy. Linia 7. minimum znak równości tab otwórz nawias kwadratowy lewy zamknij nawias kwadratowy średnik. Linia 8. maksimum znak równości tab otwórz nawias kwadratowy lewy zamknij nawias kwadratowy średnik. Linia 9. return średnik. Linia 10. zamknij nawias klamrowy. Linia 12. prawy ukośnik prawy ukośnik dwa elementy. Linia 13. if otwórz nawias okrągły prawy znak równości znak równości lewy plus 1 zamknij nawias okrągły otwórz nawias klamrowy. Linia 14. if otwórz nawias okrągły tab otwórz nawias kwadratowy lewy zamknij nawias kwadratowy otwórz nawias ostrokątny tab otwórz nawias kwadratowy prawy zamknij nawias kwadratowy zamknij nawias okrągły otwórz nawias klamrowy. Linia 15. minimum znak równości tab otwórz nawias kwadratowy lewy zamknij nawias kwadratowy średnik. Linia 16. maksimum znak równości tab otwórz nawias kwadratowy prawy zamknij nawias kwadratowy średnik. Linia 17. zamknij nawias klamrowy else otwórz nawias klamrowy. Linia 18. minimum znak równości tab otwórz nawias kwadratowy prawy zamknij nawias kwadratowy średnik. Linia 19. maksimum znak równości tab otwórz nawias kwadratowy lewy zamknij nawias kwadratowy średnik. Linia 20. zamknij nawias klamrowy. Linia 21. return średnik. Linia 22. zamknij nawias klamrowy. Linia 24. prawy ukośnik prawy ukośnik więcej elementów – dzielimy problem. Linia 25. int srodek znak równości otwórz nawias okrągły lewy plus prawy zamknij nawias okrągły prawy ukośnik 2 średnik. Linia 27. int min podkreślnik l przecinek max podkreślnik l średnik. Linia 28. int min podkreślnik p przecinek max podkreślnik p średnik. Linia 30. prawy ukośnik prawy ukośnik lewa połowa. Linia 31. min podkreślnik max podkreślnik dziel podkreślnik i podkreślnik zwyciezaj otwórz nawias okrągły tab przecinek lewy przecinek srodek przecinek min podkreślnik l przecinek max podkreślnik l zamknij nawias okrągły średnik. Linia 33. prawy ukośnik prawy ukośnik prawa połowa. Linia 34. min podkreślnik max podkreślnik dziel podkreślnik i podkreślnik zwyciezaj otwórz nawias okrągły tab przecinek srodek plus 1 przecinek prawy przecinek min podkreślnik p przecinek max podkreślnik p zamknij nawias okrągły średnik. Linia 36. prawy ukośnik prawy ukośnik łączenie wyników. Linia 37. minimum znak równości otwórz nawias okrągły min podkreślnik l otwórz nawias ostrokątny min podkreślnik p zamknij nawias okrągły znak zapytania min podkreślnik l dwukropek min podkreślnik p średnik. Linia 38. maksimum znak równości otwórz nawias okrągły max podkreślnik l zamknij nawias ostrokątny max podkreślnik p zamknij nawias okrągły znak zapytania max podkreślnik l dwukropek max podkreślnik p średnik. Linia 39. zamknij nawias klamrowy. Linia 41. int main otwórz nawias okrągły zamknij nawias okrągły otwórz nawias klamrowy. Linia 42. const int n znak równości 6 średnik. Linia 43. int tab otwórz nawias kwadratowy n zamknij nawias kwadratowy znak równości otwórz nawias klamrowy minus 2 przecinek 13 przecinek 1 przecinek minus 3 przecinek 7 przecinek 22 zamknij nawias klamrowy średnik. Linia 45. int minimum przecinek maksimum średnik. Linia 47. min podkreślnik max podkreślnik dziel podkreślnik i podkreślnik zwyciezaj otwórz nawias okrągły tab przecinek 0 przecinek n minus 1 przecinek minimum przecinek maksimum zamknij nawias okrągły średnik. Linia 49. cout otwórz nawias ostrokątny otwórz nawias ostrokątny cudzysłów Minimum dwukropek cudzysłów otwórz nawias ostrokątny otwórz nawias ostrokątny minimum otwórz nawias ostrokątny otwórz nawias ostrokątny endl średnik. Linia 50. cout otwórz nawias ostrokątny otwórz nawias ostrokątny cudzysłów Maksimum dwukropek cudzysłów otwórz nawias ostrokątny otwórz nawias ostrokątny maksimum otwórz nawias ostrokątny otwórz nawias ostrokątny endl średnik. Linia 52. return 0 średnik. Linia 53. zamknij nawias klamrowy.