基于python插入排序遞歸算法與非遞歸算法比較

實驗代碼

# 插入排序遞歸算法與非遞歸算法比較
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]
            # 繼續(xù)往前尋找,如果有比臨時變量大的數字,則后移一位,直到找到比臨時變量小的元素或者達到列表第一個元素
            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
    # 循環(huán)向后加一,直到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(下界,上界,步長)為節(jié)省時間選擇較大的步長
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()系統(tǒng)模塊設置上限值洞斯。運行迭代次數在3000以內運行成功大于3000運行失敗。
    解決辦法2:尾遞歸,每一級調用直接返回函數的返回值更新調用棧,而不用創(chuàng)建新的調用棧, 類似迭代的實現, 時間和空間上均優(yōu)化了一般遞歸飞几。
  2. 程序邏輯錯誤

    把遞歸與非遞歸函數時間統(tǒng)計寫在一個函數,最后導致遞歸算法排序的數組已經被非遞歸算法排序完成轧邪。測試時間如圖
    迭代時間正確,遞歸在有序數列上排序導致時間幾乎不變
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子俯萎,更是在濱河造成了極大的恐慌凉袱,老刑警劉巖芥吟,帶你破解...
    沈念sama閱讀 210,914評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現場離奇詭異绑蔫,居然都是意外死亡运沦,警方通過查閱死者的電腦和手機,發(fā)現死者居然都...
    沈念sama閱讀 89,935評論 2 383
  • 文/潘曉璐 我一進店門配深,熙熙樓的掌柜王于貴愁眉苦臉地迎上來携添,“玉大人,你說我怎么就攤上這事篓叶×衣樱” “怎么了?”我有些...
    開封第一講書人閱讀 156,531評論 0 345
  • 文/不壞的土叔 我叫張陵缸托,是天一觀的道長左敌。 經常有香客問我,道長俐镐,這世上最難降的妖魔是什么矫限? 我笑而不...
    開封第一講書人閱讀 56,309評論 1 282
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上叼风,老公的妹妹穿的比我還像新娘取董。我一直安慰自己,他們只是感情好无宿,可當我...
    茶點故事閱讀 65,381評論 5 384
  • 文/花漫 我一把揭開白布茵汰。 她就那樣靜靜地躺著,像睡著了一般孽鸡。 火紅的嫁衣襯著肌膚如雪蹂午。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,730評論 1 289
  • 那天彬碱,我揣著相機與錄音豆胸,去河邊找鬼。 笑死堡妒,一個胖子當著我的面吹牛配乱,可吹牛的內容都是我干的。 我是一名探鬼主播皮迟,決...
    沈念sama閱讀 38,882評論 3 404
  • 文/蒼蘭香墨 我猛地睜開眼搬泥,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了伏尼?” 一聲冷哼從身側響起忿檩,我...
    開封第一講書人閱讀 37,643評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎爆阶,沒想到半個月后燥透,有當地人在樹林里發(fā)現了一具尸體,經...
    沈念sama閱讀 44,095評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡辨图,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,448評論 2 325
  • 正文 我和宋清朗相戀三年班套,在試婚紗的時候發(fā)現自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片故河。...
    茶點故事閱讀 38,566評論 1 339
  • 序言:一個原本活蹦亂跳的男人離奇死亡吱韭,死狀恐怖,靈堂內的尸體忽然破棺而出鱼的,到底是詐尸還是另有隱情理盆,我是刑警寧澤,帶...
    沈念sama閱讀 34,253評論 4 328
  • 正文 年R本政府宣布凑阶,位于F島的核電站猿规,受9級特大地震影響,放射性物質發(fā)生泄漏宙橱。R本人自食惡果不足惜姨俩,卻給世界環(huán)境...
    茶點故事閱讀 39,829評論 3 312
  • 文/蒙蒙 一蘸拔、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧哼勇,春花似錦都伪、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,715評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽猬仁。三九已至帝璧,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間湿刽,已是汗流浹背的烁。 一陣腳步聲響...
    開封第一講書人閱讀 31,945評論 1 264
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留诈闺,地道東北人渴庆。 一個月前我還...
    沈念sama閱讀 46,248評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像雅镊,于是被迫代替她去往敵國和親襟雷。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,440評論 2 348