這裡列出了插入排序,歸併排序,以及歸併-插入混合排序的演算法並測試了三種排序在最壞情況下的運算速度比較。結果表明歸併-插入混合排序是優於前兩者的。但是混合排序在選擇切換臨界值時,並不是簡單比較在前兩種演算法在不同序列長度下的快慢,因為歸併排序在臨界值附近過分割,反而會降低效率。不過我也沒找到更好的方法
# -*- coding: utf-8 -*-
def mergesort(l, p, r):
if p < r:
q = (p+r)/2
mergesort(l, p, q)
mergesort(l, q+1, r)
merge(l, p, q, r)
def merge(l, p, q, r):
l1 = l[p:q+1]
l2 = l[q+1:r+1]
for x in range(p, r+1):
if (len(l1) is not 0) & (len(l2) is not 0):
if l1[0] < l2[0]:
l[x] = l1[0]
l1.pop(0)
else:
l[x] = l2[0]
l2.pop(0)
elif len(l1) is 0:
l[x] = l2[0]
l2.pop(0)
else:
l[x] = l1[0]
l1.pop(0)
def insertsort(l):
n = len(l)
for i in range(1, n):
key = l.pop(i)
j = i-1
while (j >= 0) & (key < l[j]):
j -= 1
l.insert(j+1, key)
def mergeandinsertsortmix(l):
def insertsort1(l, p, r):
for i in range(p+1, r+1):
key = l.pop(i)
j = i-1
while (j >= p) & (key < l[j]):
j -= 1
l.insert(j+1, key)
def mergesort1(l, p, r):
if (r-p) > 90:
q = (p+r)/2
mergesort1(l, p, q)
mergesort1(l, q+1, r)
merge(l, p, q, r)
else:
insertsort1(l, p, r)
mergesort1(l, 0, len(l)-1)
l = range(0, 1500)
l.reverse()
import time
start = time.clock()
insertsort(l)
end = time.clock()
print end - start
l.reverse()
start = time.clock()
mergesort(l, 0, len(l)-1)
end = time.clock()
print end - start
l.reverse()
start = time.clock()
mergeandinsertsortmix(l)
end = time.clock()
print end - start
print l
排序演算法 插入,希爾和歸併
如有錯誤,請指出,多謝。來自菜鳥教程,多謝。一 插入排序 插入排序的基本思想是 每步將乙個待排序的記錄,按其關鍵碼值的大小插入前面已經排序的檔案中適當位置上,直到全部插入完為止 import random def insertsort arr for i in range 1,len arr 獲取前...
排序演算法 冒泡 插入 歸併 快排
整理了一下幾種常見的排序演算法,包括冒泡 插入 歸併 快排。還有另外幾種待整理 堆排序 希爾排序 桶排序 直接上 include include include using namespace std void swap int a,int b 最簡單的氣泡排序,時間複雜度o n n void bu...
演算法筆記之插入 歸併排序
對於少量元素的排序時,它是乙個有效的演算法。其核心思想是乙個乙個把元素插入乙個已經排序好的序列當中進行排序。其 為 a 需要排序的陣列 length 陣列的長度 void insertion sort int a,int length a i 1 key 歸併排序演算法的是 合併 步驟中2個已經排好...