排序算法
Posted t0000
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了排序算法相关的知识,希望对你有一定的参考价值。
插入排序:
循环不变式:每次循环从数组A中取出第j个元素插入有序区A[1 .. j-1],然后递增j。这样A[1 .. j-1]的有序性始终得到保持,这就是所谓的“循环不变 (loop invariant)”。
循环不变式在理论上保证插入排序算法的正确性。
插入排序的时间复杂度是 O(n2)
归并排序:
归并排序采用分治法。将待排数列等分成两部分,无限分隔下去,直到最后只有一个元素,然后再回归合并。
可以看到插入排序效率并不高,排1w个数字耗时10秒
归并排序的时间复杂度是 O(n log n)
1 """ 2 @Author TZG 3 @Email [email protected] 4 """ 5 6 import random 7 import time 8 9 # 生成一个长度1w的随机数列 10 a = [] 11 for i in range(10000): 12 a.append(random.randint(0, 10000)) 13 14 print(len(a)) 15 temp = a[:] 16 temp[5:9995] = [‘...‘] 17 print(temp) 18 19 # 插入排序开始 20 begin = time.time() 21 for i in range(len(a)): 22 for j in range(i, len(a)): 23 if a[j] < a[i]: 24 temp = a[i] 25 a[i] = a[j] 26 a[j] = temp 27 end = time.time() 28 print(len(a)) 29 temp = a[:] 30 temp[5:9995] = [‘...‘] 31 print(temp) 32 t1 = (end - begin) 33 print("耗时:%ss" % t1) 34 35 36 # 合并函数 37 def merge(a, b): 38 c = [] 39 h = j = 0 40 while j < len(a) and h < len(b): 41 if a[j] < b[h]: 42 c.append(a[j]) 43 j += 1 44 else: 45 c.append(b[h]) 46 h += 1 47 48 if j == len(a): 49 for i in b[h:]: 50 c.append(i) 51 else: 52 for i in a[j:]: 53 c.append(i) 54 55 return c 56 57 58 # 递归函数 59 def meger_sort(lists): 60 if len(lists) <= 1: 61 return lists 62 middle = int(len(lists) / 2) 63 left = meger_sort(lists[:middle]) 64 right = meger_sort(lists[middle:]) 65 return merge(left, right) 66 67 68 # 归并排序开始 69 begin = time.time() 70 b = meger_sort(a) 71 end = time.time() 72 print(len(b)) 73 temp = b[:] 74 temp[5:9995] = [‘...‘] 75 print(temp) 76 t2 = (end - begin) 77 print("耗时:%ss" % t2) 78 print("倍数:%s" % (t1 / t2))
输出:
1 10000 2 [9103, 2832, 7141, 6074, 6077, ‘...‘, 7044, 5579, 7611, 2213, 9118] 3 10000 4 [0, 1, 2, 5, 5, ‘...‘, 9997, 9998, 9998, 9998, 9999] 5 耗时:9.352935075759888s 6 10000 7 [0, 1, 2, 5, 5, ‘...‘, 9997, 9998, 9998, 9998, 9999] 8 耗时:0.039003849029541016s 9 倍数:239.79518197488906
可以看到,同样是排1W个数字,插入排序花的时间是归并排序的 239 倍
end
以上是关于排序算法的主要内容,如果未能解决你的问题,请参考以下文章