排序算法

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

以上是关于排序算法的主要内容,如果未能解决你的问题,请参考以下文章

算法排序之堆排序

快速排序-递归实现

从搜索文档中查找最小片段的算法?

在第6731次释放指针后双重免费或损坏

TimSort算法分析

以下代码片段的算法复杂度