美文网首页
基于python插入排序递归算法与非递归算法比较

基于python插入排序递归算法与非递归算法比较

作者: 都灵的夏天_ | 来源:发表于2020-10-12 20:26 被阅读0次

实验代码

# 插入排序递归算法与非递归算法比较
import time
from matplotlib import pyplot as plt
import types
import random
import sys
# 设置上限值
sys.setrecursionlimit(100000)

# 产生随机数组
def random_int_list(start, stop, length):
    start, stop = (int(start), int(stop)) if start <= stop else (int(stop), int(start))
    length = int(abs(length)) if length else 0
    random_list = []
    for i in range(length):
        random_list.append(random.randint(start, stop))
    return random_list


# 直接插入排序非递归实现
def InsertSort(myList):
    # 获取列表长度
    length = len(myList)
    for i in range(1, length):
        # 设置当前值前一个元素的标识
        j = i - 1
        # 如果当前值小于前一个元素,则将当前值作为一个临时变量存储,将前一个元素后移一位
        if (myList[i] < myList[j]):
            temp = myList[i]
            myList[i] = myList[j]
            # 继续往前寻找,如果有比临时变量大的数字,则后移一位,直到找到比临时变量小的元素或者达到列表第一个元素
            j = j - 1
            while j >= 0 and myList[j] > temp:
                myList[j + 1] = myList[j]
                j = j - 1
            # 将临时变量赋值给合适位置
            myList[j + 1] = temp


# 递归算法 从前往后不断递归排序
def InsertSortRecursion(array, i=1):
    if i >= len(array):
        yield array
    if array[i - 1] > array[i]:
        temp = array[i]
        for a in range(0, i):
            if temp < array[a]:
                # 在array[a]插入temp
                array.insert(a, temp)
                # 删除 最后一个
                del array[i + 1]
                break
    # 循环向后加一,直到i = len(array)
    yield InsertSortRecursion(array, i + 1)

# 尾递归,破解递归限制
def tramp(gen, *args, **kwargs):
    g = gen(*args, **kwargs)
    while isinstance(g, types.GeneratorType):
        g = g.__next__()
    return g


# 非递归时间序列
timer = []
# 递归时间序列
timer_r = []
n = []
# range(下界,上界,步长)为节省时间选择较大的步长
for i in range(0, 50000, 5000):
    print("i=", i)
    n.append(i)
    myList = random_int_list(1, 100000, i)
    # 计算非递归算法时间
    start_time = time.time()
    InsertSort(myList)
    end_time = time.time()

    timer1 = end_time - start_time
    print("迭代时间", timer1)
    timer.append(timer1)

    # 打乱上次已经有序的数列
    myList = random_int_list(1, 100000, i)
    # 计算递归算法时间
    start_time1 = time.time()
    # InsertSortRecursion(myList)
    tramp(InsertSortRecursion, myList)
    end_time1 = time.time()
    timer2 = end_time1 - start_time1
    print("递归时间",timer2)
    timer_r.append(timer2)

# 绘图
plt.plot(n,timer,n,timer_r)
plt.legend(['iteration', 'recursion'])
plt.xlabel('n')
plt.ylabel('t')
plt.title(' interation and recursion about insert sort ')
plt.show()

实验结果

插入排序递归算法与非递归算法比较

错误分析

  1. 越界错误
    Python3中迭代限制默认次数为1000次以内,导致数据大于1000个是迭代失败,
    解决办法1:添加sys.setrecursionlimit()系统模块设置上限值。运行迭代次数在3000以内运行成功大于3000运行失败。
    解决办法2:尾递归,每一级调用直接返回函数的返回值更新调用栈,而不用创建新的调用栈, 类似迭代的实现, 时间和空间上均优化了一般递归。
  2. 程序逻辑错误

    把递归与非递归函数时间统计写在一个函数,最后导致递归算法排序的数组已经被非递归算法排序完成。测试时间如图 迭代时间正确,递归在有序数列上排序导致时间几乎不变

相关文章

  • 基于python插入排序递归算法与非递归算法比较

    实验代码 实验结果 错误分析 越界错误Python3中迭代限制默认次数为1000次以内,导致数据大于1000个是迭...

  • 快速幂模板

    递归算法 非递归算法

  • 欧几里得算法

    非递归算法 默认输入 m>=n 递归算法

  • Java递归算法详解

    递归算法是一种直接或者间接调用自身函数或者方法的算法。Java递归算法是基于Java语言实现的递归算法。递归算法的...

  • 算法

    1.很多算法都可以通过递归和循环两种方式实现。 通常基于递归的实现算法代码会比较简洁,但性能不如基于循环的实现算法...

  • 一、算法

    目标 递归算法查找算法算法分析十大排序算法 递归算法 什么是递归递归,在数学与计算机科学中,是指在函数的定义中使用...

  • 快速排序

    python版本快速排序: 1. 简洁版递归: 2. 常见版本: 3. 算法导论版: 4. 非递归版:

  • 三叉链表的遍历算法

    1. 不借助栈的非递归中序遍历算法 2. 不借助栈的非递归后序遍历算法

  • python递归算法、尾递归算法及优化

    文章概述 递归算法和尾递归概述递归算法的优化 递归算法 介绍:递归算法是计算机编程领域非常重要的一种算法,采用分而...

  • C++ 递归算法

    递归算法,尾递归算法求阶乘!

网友评论

      本文标题:基于python插入排序递归算法与非递归算法比较

      本文链接:https://www.haomeiwen.com/subject/jmmppktx.html