R1QX9EB6BE8D1
Zdjęcie przedstawia owoce sezonowe w małych pojemnikach, porzeczki, jagody, borówki, maliny i poziomki.

I_R_W14_M25_Java Szukanie jednoczesne min‑max

Źródło: Alex Block, domena publiczna.

Metoda „Dziel i zwyciężaj” (ang. Divide and Conquer) to potężna technika projektowania algorytmów, która polega na rozbiciu złożonego problemu na mniejsze, łatwiejsze do rozwiązania podproblemy tego samego typu.

Proces ten składa się z trzech głównych kroków:

  • Dziel (Divide): Rozdzielamy problem na mniejsze części (zwykle na dwie połowy).

  • Zwyciężaj (Conquer): Rozwiązujemy te mniejsze problemy (często rekurencyjnie). Jeśli problem jest wystarczająco mały (przypadek bazowy), rozwiązujemy go bezpośrednio.

  • Połącz (Combine): Łączymy rozwiązania mniejszych części w jedno rozwiązanie problemu głównego.

W przypadku szukania minimum i maksimum, zamiast porównywać każdy element po kolei, dzielimy tablicę na pół, aż otrzymamy segmenty jedno- lub dwuelementowe.

Implementacja algorytmu w języku Java

1
Ćwiczenie 1

Napisz program, który wykorzystując metodę bąbelkową, wyznaczy i przesunie na początek ciągu liczbowego (reprezentowanego w programie jako tablica) najmniejszy jego wyraz. Po wyznaczeniu i przesunięciu najmniejszego wyrazu na początek ciągu, wypisz go.

Specyfikacja problemu:

Dane:

  • ciag – ciąg liczb całkowitych zapisany w tablicy; tablica liczb całkowitych

  • n – długość ciągu (rozmiar tablicy); liczba całkowita

Wynik:

  • najmniejszaLiczba – najmniejszy wyraz ciągu; liczba całkowita

R1OFRJ9PV6GQ9
Linia 1. zamknij nawias klamrowy.
Linia 1. zamknij nawias klamrowy. Linia 4. prawy ukośnik prawy ukośnik DZIEL dwukropek Wyznaczamy środek i dzielimy na dwa podproblemy. Linia 5. int polowa znak równości otwórz nawias okrągły pocz plus kon zamknij nawias okrągły prawy ukośnik 2 średnik. Linia 7. prawy ukośnik prawy ukośnik ZWYCIĘŻAJ dwukropek Rekurencyjne wywołania dla lewej i prawej strony. Linia 8. int otwórz nawias kwadratowy zamknij nawias kwadratowy lewa znak równości znajdzMinMax otwórz nawias okrągły tablica przecinek pocz przecinek polowa zamknij nawias okrągły średnik. Linia 9. int otwórz nawias kwadratowy zamknij nawias kwadratowy prawa znak równości znajdzMinMax otwórz nawias okrągły tablica przecinek polowa plus 1 przecinek kon zamknij nawias okrągły średnik. Linia 11. prawy ukośnik prawy ukośnik POŁĄCZ dwukropek Wybieramy globalne min i max z obu połówek. Linia 12. int min znak równości Math kropka min otwórz nawias okrągły lewa otwórz nawias kwadratowy 0 zamknij nawias kwadratowy przecinek prawa otwórz nawias kwadratowy 0 zamknij nawias kwadratowy zamknij nawias okrągły średnik. Linia 13. int max znak równości Math kropka max otwórz nawias okrągły lewa otwórz nawias kwadratowy 1 zamknij nawias kwadratowy przecinek prawa otwórz nawias kwadratowy 1 zamknij nawias kwadratowy zamknij nawias okrągły średnik. Linia 15. return new int otwórz nawias kwadratowy zamknij nawias kwadratowy otwórz nawias klamrowy min przecinek max zamknij nawias klamrowy średnik.

}

public static void main(String[] args) { int[] dane = {34, 7, 23, 32, 5, 62, 12, 1};

Linia 1. prawy ukośnik prawy ukośnik Wywołujemy funkcję dla całego zakresu tablicy. Linia 2. int otwórz nawias kwadratowy zamknij nawias kwadratowy wynik znak równości znajdzMinMax otwórz nawias okrągły dane przecinek 0 przecinek dane kropka length minus 1 zamknij nawias okrągły średnik. Linia 4. System kropka out kropka println otwórz nawias okrągły cudzysłów Znalezione minimum dwukropek cudzysłów plus wynik otwórz nawias kwadratowy 0 zamknij nawias kwadratowy zamknij nawias okrągły średnik. Linia 5. System kropka out kropka println otwórz nawias okrągły cudzysłów Znalezione maksimum dwukropek cudzysłów plus wynik otwórz nawias kwadratowy 1 zamknij nawias kwadratowy zamknij nawias okrągły średnik.

} }