Python实现直接插入排序递归与非递归算法

实验问题:​​​​​​​

用程序实现插入排序的递归与非递归算法,并分别画出程序的运行时间t与元素个数的曲线图。

实验环境:

Python3.7

实验过程:

  1. 首先产生数据范围为(1,1000)的随机数组共1000个,每个数组内分别存有1,2,3...1000个随机数。并且为了保证两种算法使用的数据集相同,即对于每个数组都有一个副本,一个供递归算法使用,一个供非递归算法使用,即Array_1与Array_1
  2. 编写插入排序递归算法函数InsertionSortRec(n, A)与插入排序非递归算法函数InsertionSort(n, A)
  3. 循环执行两种算法函数,并把每次执行时间分别存入在两个时间数组变量Time_1与Time_2中
  4. 绘制运行时间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()

 实验结果:


​​​​​​​

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值