-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmin_max_divide_conquer.py
41 lines (32 loc) · 1.28 KB
/
min_max_divide_conquer.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
import colorama
from colorama import Fore
colorama.init(autoreset=True)
def find_min_max(arr):
"""
Finds the minimum and maximum elements in an array using the "divide and conquer" approach.
:param arr: List of numbers
:return: Tuple (minimum value, maximum value)
:raises ValueError: If input is not a non-empty list
"""
# Input validation
if not isinstance(arr, list) or len(arr) == 0:
raise ValueError("Input must be a non-empty list.")
# Base case: if the array has only one element
if len(arr) == 1:
return arr[0], arr[0]
# Base case: if the array has two elements
if len(arr) == 2:
return (arr[0], arr[1]) if arr[0] < arr[1] else (arr[1], arr[0])
# Recursive case: split the array into two halves
mid = len(arr) // 2
left_min, left_max = find_min_max(arr[:mid])
right_min, right_max = find_min_max(arr[mid:])
# Combine results from both halves
return min(left_min, right_min), max(left_max, right_max)
if __name__ == "__main__":
# Example usage
numbers = [12, 4, 19, 33, 7, 1, 25, 18]
min_val, max_val = find_min_max(numbers)
print(Fore.GREEN + "Array of numbers:", numbers)
print(Fore.CYAN + f"Minimum value: {min_val}")
print(Fore.MAGENTA + f"Maximum value: {max_val}")