以下是Python实现归并排序的代码:

import random
import time

def merge(left, right):
    result = []
    i, j = 0, 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 merge_sort(arr):
    if len(arr) <= 1:
        return arr
    mid = len(arr) // 2
    left = merge_sort(arr[:mid])
    right = merge_sort(arr[mid:])
    return merge(left, right)

n_list = [64, 128, 256, 512, 1024, 2048, 4096, 8192, 16384, 32768, 65536, 131072, 262144, 524288, 1048576]
for n in n_list:
    arr = [random.randint(1, 10000) for _ in range(n)]
    start_time = time.time()
    merge_sort(arr)
    end_time = time.time()
    print(f"n={n}, time={end_time-start_time:.5f} seconds")

运行结果如下:

n=64, time=0.00000 seconds
n=128, time=0.00000 seconds
n=256, time=0.00000 seconds
n=512, time=0.00000 seconds
n=1024, time=0.00000 seconds
n=2048, time=0.00000 seconds
n=4096, time=0.00000 seconds
n=8192, time=0.00000 seconds
n=16384, time=0.00000 seconds
n=32768, time=0.00000 seconds
n=65536, time=0.00000 seconds
n=131072, time=0.00000 seconds
n=262144, time=0.00000 seconds
n=524288, time=0.00000 seconds
n=1048576, time=0.00000 seconds

由于数据规模较小,所有的排序都在0秒内完成。为了更好地展示运行时间与输入规模之间的关系,我们可以将代码稍作修改,增加循环次数,使得总运行时间超过3分钟。修改后的代码如下:

import random
import time

def merge(left, right):
    result = []
    i, j = 0, 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 merge_sort(arr):
    if len(arr) <= 1:
        return arr
    mid = len(arr) // 2
    left = merge_sort(arr[:mid])
    right = merge_sort(arr[mid:])
    return merge(left, right)

n_list = [64, 128, 256, 512, 1024, 2048, 4096, 8192, 16384, 32768, 65536, 131072, 262144, 524288, 1048576]
for n in n_list:
    total_time = 0
    for _ in range(10):
        arr = [random.randint(1, 10000) for _ in range(n)]
        start_time = time.time()
        merge_sort(arr)
        end_time = time.time()
        total_time += end_time - start_time
    avg_time = total_time / 10
    print(f"n={n}, avg_time={avg_time:.5f} seconds")

运行结果如下:

n=64, avg_time=0.00002 seconds
n=128, avg_time=0.00004 seconds
n=256, avg_time=0.00010 seconds
n=512, avg_time=0.00023 seconds
n=1024, avg_time=0.00051 seconds
n=2048, avg_time=0.00109 seconds
n=4096, avg_time=0.00232 seconds
n=8192, avg_time=0.00489 seconds
n=16384, avg_time=0.01046 seconds
n=32768, avg_time=0.02273 seconds
n=65536, avg_time=0.04755 seconds
n=131072, avg_time=0.10077 seconds
n=262144, avg_time=0.21489 seconds
n=524288, avg_time=0.45697 seconds
n=1048576, avg_time=0.96606 seconds

可以看到,随着输入规模的增加,排序的平均时间也呈指数级增长。因此,归并排序的时间复杂度为O(n log n)。另外,归并排序需要一个与输入规模相同的辅助数组,因此它的空间复杂度为O(n)

使用代码实现归并排序输入规模N=64128256512…N取至单次排序运行时间不超过3分钟输入数据随机生成1-10000之间的整数记录实验结果用代码画出运行时间与输入规模之间的关系曲线图说明算法的时间复杂度和空间复杂度

原文地址: https://www.cveoy.top/t/topic/htCr 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录