实验问题:
用程序实现插入排序的递归与非递归算法,并分别画出程序的运行时间t与元素个数的曲线图。
实验环境:
Python3.7
实验过程:
- 首先产生数据范围为(1,1000)的随机数组共1000个,每个数组内分别存有1,2,3...1000个随机数。并且为了保证两种算法使用的数据集相同,即对于每个数组都有一个副本,一个供递归算法使用,一个供非递归算法使用,即Array_1与Array_1
- 编写插入排序递归算法函数InsertionSortRec(n, A)与插入排序非递归算法函数InsertionSort(n, A)
- 循环执行两种算法函数,并把每次执行时间分别存入在两个时间数组变量Time_1与Time_2中
- 绘制运行时间t与规模元素个数n的曲线。
实验代码
import random
import sys
import time
import numpy as np
import matplotlib.pyplot as plt
sys.setrecursionlimit(1000000)
def InsertionSortRec(n, A): # 递归算法
if n > 1:
InsertionSortRec(n - 1, A)
x = A[n - 1]
j = n - 2
while j >= 0 and A[j] > x:
A[j + 1] = A[j]
j = j - 1
A[j + 1] = x
def InsertionSort(n, A): # 非递归算法
for i in range(1, n):
temp = A[i]
j = i - 1
while j >= 0 and A[j] > temp:
A[j + 1] = A[j]
j = j - 1
A[j + 1] = temp
#设置组名
Time_1 = []
Num = []
Time_2 = []
for i in range(1, 500, 1):
Array = random.sample(range(0, 500), i) #产生随机数,最大为500个
Array_1 = Array[:]
Array_2 = Array[:]
Num.append(i)
# 递归算法,并计算时间
starTime_1 = time.time()
InsertionSortRec(i, Array_1)
endTime_1 = time.time()
Time_1.append(endTime_1 - starTime_1)
# 非递归算法,并计算时间
starTime_2 = time.time()
InsertionSort(i, Array_2)
endTime_2 = time.time()
Time_2.append(endTime_2 - starTime_2)
# 单位转化为毫秒
for i in range(len(Num)):
Time_1[i] = Time_1[i] * 1000
Time_2[i] = Time_2[i] * 1000
# 绘制图表
plt.rcParams['font.sans-serif'] = 'SimHei'
plt.figure(figsize=(20, 12))
plt.title('The relationship between time t(ms) and size N}')
plt.xlabel('num (N)')
plt.ylabel('time(ms)')
plt.plot(Num, Time_1, label='Recursion')
plt.plot(Num, Time_2, label='No_recursion')
plt.legend()
plt.show()
实验结果: