随机生成几千万个整数,然后使用多线程技术对它们排序
时间: 2023-12-03 12:03:00 浏览: 159
好的,可以使用多线程的归并排序来实现这个任务。以下是一个示例代码:
```python
import threading
import random
# 生成随机整数列表
nums = [random.randint(0, 1000) for _ in range(10000000)]
# 归并排序函数
def merge_sort(nums):
if len(nums) <= 1:
return nums
mid = len(nums) // 2
left = merge_sort(nums[:mid])
right = merge_sort(nums[mid:])
return merge(left, right)
# 归并函数
def merge(left, right):
result = []
i = j = 0
while i < len(left) and j < len(right):
if left[i] < right[j]:
result.append(left[i])
i += 1
else:
result.append(right[j])
j += 1
result += left[i:]
result += right[j:]
return result
# 多线程归并排序函数
def multi_merge_sort(nums, threads=4):
if threads == 1:
return merge_sort(nums)
mid = len(nums) // 2
left = nums[:mid]
right = nums[mid:]
left_thread = threading.Thread(target=lambda q: q.put(multi_merge_sort(left, threads=threads//2)), args=(queue,))
right_thread = threading.Thread(target=lambda q: q.put(multi_merge_sort(right, threads=threads//2)), args=(queue,))
left_thread.start()
right_thread.start()
left_result = queue.get()
right_result = queue.get()
left_thread.join()
right_thread.join()
return merge(left_result, right_result)
# 测试
queue = queue.Queue()
sorted_nums = multi_merge_sort(nums)
print(sorted_nums[:10])
```
这个程序首先生成了一个包含 10000000 个随机整数的列表 `nums`。然后定义了两个排序函数,`merge_sort` 和 `multi_merge_sort`,前者是单线程的归并排序,后者是多线程的归并排序。`merge_sort` 函数使用递归实现,将列表不断分为左右两半并递归排序,最后再将左右两个有序列表合并。`multi_merge_sort` 函数也是递归实现,但是在每个递归层次上使用了多线程。具体地,这个函数首先将列表分为左右两半,然后启动两个线程分别对左右两个列表进行排序,排序完成后再将左右两个有序列表合并。如果当前线程数小于等于 1,就直接调用单线程的归并排序函数。注意这里使用了 Python 的内置队列模块 `queue` 来实现线程间通信。
最后,我们测试了一下多线程归并排序函数,输出了排序后的前 10 个数。需要注意的是,多线程归并排序的性能取决于线程数和计算机的硬件条件,因此可能需要根据实际情况进行调整。
阅读全文