实现合并排序算法。要排序的整型数组元素可以用随机数生成器生成,运行程序,分别记录对十万,一百万,五千万,一千万个数据排序所用的时间,列出表格显示统计出来的时间。并单独显示一个100个数据的排序结果。
时间: 2024-12-22 16:21:37 浏览: 5
实现合并排序算法的步骤如下:
1. **分治策略**:将待排序数组分为两半,直到每个子数组只剩下一个元素,这一步叫做"分"。
2. **合并操作**:将两个已排序的子数组合并成一个有序数组,这是"治"的过程。
3. **递归调用**:对于每一步分割,都要递归地对左右子数组进行同样的操作,直到原始数组完全被处理。
以下是合并排序的一个基本Python实现:
```python
def merge_sort(arr):
if len(arr) <= 1:
return arr
# 分割数组
mid = len(arr) // 2
left_half = arr[:mid]
right_half = arr[mid:]
# 递归排序
left_half = merge_sort(left_half)
right_half = merge_sort(right_half)
# 合并两个有序数组
return merge(left_half, right_half)
def merge(left, right):
merged = []
i = j = 0
while i < len(left) and j < len(right):
if left[i] <= right[j]:
merged.append(left[i])
i += 1
else:
merged.append(right[j])
j += 1
# 添加剩余未比较的部分
merged.extend(left[i:])
merged.extend(right[j:])
return merged
```
为了测量不同规模数据排序所需时间,你可以使用`timeit`模块:
```python
import random
import timeit
# 生成随机数组
data_sizes = [100000, 1000000, 5000000, 10000000]
arrays = [sorted(random.sample(range(1, n + 1), n)) for n in data_sizes]
# 记录排序时间
times = {size: timeit.timeit('merge_sort(arr)', globals=globals(), number=1) for size, arr in zip(data_sizes, arrays)}
# 打印表格
print("Data Size\t\tSorting Time (seconds)")
for size, time in times.items():
print(f"{size}\t\t{time:.6f}")
# 对100个数据进行排序并打印结果
arr_100 = sorted(random.sample(range(1, 101), 100))
print("\n100 Data Points:\n", arr_100)
```
请注意,实际运行这个代码会因为计算机性能、操作系统等因素有所不同,所以时间可能会有所差异。运行该程序时,会输出一个时间表以及100个数据点的排序结果。
阅读全文