常见算法或者数据结构大家都少都有接触,其实算法很有意思,多刷一些题或者多见一些没有见过的题,可以让思维更开放。下面是常见的一些算法的总结,算是总结得比较完整的了,也涉及到了一些常见的面试题,看完或者学习完成后,是非常有帮助的,希望自己以后也多有时间回来看看。
冒泡排序
两两相比较,如果前者比后者大(顺序可以自己定,这里是大的往下沉,最后得出顺序为从小到大),就交换1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26例如:现在有以下数组(或者列表)
[1, 5, 6, 8, 7, 12, 3, 5]
第0个元素和第1个元素进行比较,如果前者比后者大,就交换
[1, 5, 6, 8, 7, 12, 3, 5]
第1个和第2个
[1, 5, 6, 8, 7, 12, 3, 5]
第2个和第3个
[1, 5, 6, 8, 7, 12, 3, 5]
第3个和第4个
[1, 5, 6, 7, 8, 12, 3, 5]
第4个和第5个
[1, 5, 6, 7, 8, 12, 3, 5]
第5个和第6个
[1, 5, 6, 7, 8, 3, 12, 5]
第6个和第7个
[1, 5, 6, 7, 8, 3, 5, 12]
经过上面的操作,得到最大的一个数12,并将其移到了最后,重复以上的操作,再次进行排序,最后得到
[1, 3, 5, 5, 6, 7, 8, 12]
Python 代码如下1
2
3
4
5
6def bubbleSort(list):
for x in xrange(len(list)): # 外层循环,控制总的次数
for i in xrange(len(list)-1-x): # 内层循环,-1是因为list[i+1]不越界,否则会超出索引,-x是因为大循环每次循环出来一个最大数后,两两比对的次数将少一次
if list[i] > list[i+1]: # 如果前一项大于后一项,则交换
list[i], list[i+1] = list[i+1], list[i]
print list
插入排序
想必大家都玩过扑克,其实插入排序就和打扑克一样,摸到一张牌之后,根据大小放到合适的位置。1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80例如:现在有以下数组(或者列表)
[1, 5, 6, 8, 7, 12, 3, 5]
↑
指针(定义一个指针,指针位于数组或者列表的最前面,要保证指针的左边一直有序,然后指针一直右移,直到指针到数组或者列表的最后。)
比较指针所在的位置的值和指针右边的数的大小,如果指针右边的值小于指针所在位置的值,那么就交换,一直交换到有序
[1, 5, 6, 8, 7, 12, 3, 5] 5 > 6? 满足则交换两者位置,否则指针下移
↑
指针
[1, 5, 6, 8, 7, 12, 3, 5] 6 > 8? 满足则交换两者位置,否则指针下移
↑
指针
[1, 5, 6, 8, 7, 12, 3, 5] 8 > 7? 满足则交换两者位置,否则指针下移
↑
指针
[1, 5, 6, 7, 8, 12, 3, 5] 8 > 7? 满足则交换两者位置,否则指针下移
↑
指针
[1, 5, 6, 7, 8, 12, 3, 5] 8 > 12? 满足则交换两者位置,否则指针下移
↑
指针
[1, 5, 6, 7, 8, 12, 3, 5] 12 > 3? 满足则交换两者位置,否则指针下移
↑
指针
[1, 5, 6, 7, 8, 3, 12, 5] 移动数字,直到有序为止
↑
指针
[1, 5, 6, 7, 3, 8, 12, 5] 移动数字,直到有序为止
↑
指针
[1, 5, 6, 3, 7, 8, 12, 5] 移动数字,直到有序为止
↑
指针
[1, 5, 3, 6, 7, 8, 12, 5] 移动数字,直到有序为止
↑
指针
[1, 3, 5, 6, 7, 8, 12, 5] 8 > 12? 满足则交换两者位置,否则指针下移
↑
指针
[1, 3, 5, 6, 7, 8, 12, 5] 12 > 5? 满足则交换两者位置,否则指针下移
↑
指针
[1, 3, 5, 6, 7, 8, 5, 12] 移动数字,直到有序为止
↑
指针
[1, 3, 5, 6, 7, 5, 8, 12] 移动数字,直到有序为止
↑
指针
[1, 3, 5, 6, 5, 7, 8, 12] 移动数字,直到有序为止
↑
指针
[1, 3, 5, 5, 6, 7, 8, 12] 移动数字,直到有序为止
↑
指针
[1, 3, 5, 5, 6, 7, 8, 12] 8 > 12? 满足则交换两者位置,否则指针下移
↑
指针
[1, 3, 5, 5, 6, 7, 8, 12] 指针移动到最后,排序结束
↑
指针
Python 代码如下1
待写
选择排序
遍历数组或者列表,每个选出一个最值(最小值或者最大值,直到有序),以交换的方式1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23例如:现在有以下数组(或者列表)
[1, 5, 6, 8, 7, 12, 3, 5]
第一次选择当前的最小值,选过的不参与选举,再从剩下的部分选出最小值
[1, 5, 6, 8, 7, 12, 3, 5]
第二次
[1, 3, 6, 8, 7, 12, 5, 5]
第三次
[1, 3, 5, 8, 7, 12, 6, 5]
第四次
[1, 3, 5, 5, 7, 12, 6, 8]
第五次
[1, 3, 5, 5, 6, 12, 7, 8]
第六次
[1, 3, 5, 5, 6, 7, 12, 8]
第七次
[1, 3, 5, 5, 6, 7, 8, 12]
Python 代码如下1
待写
归并排序
将数组或者列表分成两部分,分别将两部分进行排序。将排好序的两部分进行整合,再次得到最终的结果。1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47例如:现在有以下数组(或者列表)
[10, 15, 6, 2, 7, 12, 3, 5]
[10, 15, 6, 2] | [7, 12, 3, 5] 拆分为两部分
[10, 15, 6, 2] | [7, 12, 3, 5] 左右两边分别进行插入排序
......
[2, 6, 10, 15] | [3, 5, 7, 12] 左右两边得到有序的结果
[2, 6, 10, 15] | [3, 5, 7, 12] 两边都有序后,定义两个指针, 分别位于两个有序数组的最前面, 同时定义一个空数组,用来放置排好序的值。定义一个空数组a=[], 用来存放排好序的值
↑ ↑
指针1 指针2
[2, 6, 10, 15] | [3, 5, 7, 12] 比较两个指针所在位置数的大小, 小的进入定义好的空数组a, 并且将指针下移, 直到有一方指针到最后位置, 将另一个剩余元素追加到a即可
↑ ↑
指针1 指针2
[2, 6, 10, 15] | [3, 5, 7, 12] a=[2]
↑ ↑
指针1 指针2
[2, 6, 10, 15] | [3, 5, 7, 12] a=[2, 3]
↑ ↑
指针1 指针2
[2, 6, 10, 15] | [3, 5, 7, 12] a=[2, 3, 5]
↑ ↑
指针1 指针2
[2, 6, 10, 15] | [3, 5, 7, 12] a=[2, 3, 5, 6]
↑ ↑
指针1 指针2
[2, 6, 10, 15] | [3, 5, 7, 12] a=[2, 3, 5, 6, 7]
↑ ↑
指针1 指针2
[2, 6, 10, 15] | [3, 5, 7, 12] a=[2, 3, 5, 6, 7, 10]
↑ ↑
指针1 指针2
[2, 6, 10, 15] | [3, 5, 7, 12] a=[2, 3, 5, 6, 7, 10], 指针2到到最后位置, 将左边剩余数据, 15追加到a之后即可, 得到 a=[2, 3, 5, 6, 7, 10, 15]
↑ ↑
指针1 指针2
Python 代码如下1
待写