Mercurial
diff grok_interview/merge_sort.py @ 51:68fa88ac73fe
Interview prep for xAI
| author | June Park <parkjune1995@gmail.com> |
|---|---|
| date | Mon, 15 Dec 2025 19:55:17 -0800 |
| parents | |
| children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/grok_interview/merge_sort.py Mon Dec 15 19:55:17 2025 -0800 @@ -0,0 +1,48 @@ +from concurrent.futures import ProcessPoolExecutor +import random +from typing import List + +def merge_sort(lst: List[int]) -> List[int]: # no executor parameter! + if len(lst) <= 1: + return lst + middle = len(lst) // 2 + # These run in separate processes → no shared thread pool problem + left = merge_sort(lst[:middle]) + right = merge_sort(lst[middle:]) + return merge(left, right) + +def merge(left: List[int], right: List[int]) -> List[int]: + res = [] + i = j = 0 + while i < len(left) and j < len(right): + if left[i] <= right[j]: + res.append(left[i]) + i += 1 + else: + res.append(right[j]) + j += 1 + res.extend(left[i:]) + res.extend(right[j:]) + return res + +RANGE = 10_000 +cpu_num = 10 +def main(): + data = [random.randint(0, 100) for _ in range(RANGE)] + sorted_data = [] + ranges = [i for i in range(RANGE // cpu_num, RANGE, RANGE // 100)] + with ProcessPoolExecutor() as executor: + for pos_range in ranges: + sorted_data.append(executor.submit(merge_sort, data[:pos_range]).result()) + + while len(sorted_data) > 1: + new_sorted_data = [] + for i in range(0, len(sorted_data), 2): + if + res = merge(sorted_data[i], sorted_data[i+1]) + new_sorted_data.append(res) + + print(len(sorted_data)) + +if __name__ == "__main__": # important on Windows/macOS + main()