算法进阶总结

常见算法或者数据结构大家都少都有接触,其实算法很有意思,多刷一些题或者多见一些没有见过的题,可以让思维更开放。下面是常见的一些算法的总结,算是总结得比较完整的了,也涉及到了一些常见的面试题,看完或者学习完成后,是非常有帮助的,希望自己以后也多有时间回来看看。

冒泡排序

两两相比较,如果前者比后者大(顺序可以自己定,这里是大的往下沉,最后得出顺序为从小到大),就交换

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
6
def 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
待写

快速排序

给定一个数组arr,和一个数num,请把小于等于num的数放在数组的左边,大于num的数放在数组的右边。

荷兰国旗

随机快排

堆排序

二叉树

完全二叉树

大根堆

小根堆

堆排

排序算法稳定性总结

桶排序

队列和栈

用数组结构实现大小固定的队列

用数组结构实现大小固定的栈

实现一个特殊的栈,在实现栈的基本功能的基础上,再实现返回栈中最小元素的操作。

如何仅用队列结构实现栈结构?

如何仅用栈结构实现队列结构?

转圈打印矩阵

旋转正方形矩阵

反转单向和双向链表

“之”字形打印矩阵

在行列都排好序的矩阵中找数

打印两个有序链表的公共部分

判断一个链表是否为回文结构

将单向链表按某值划分成左边小、中间相等、右边大的形式

将单向链表按某值划分成左边小、中间相等、右边大的形式,并保证稳定性

复制含有随机指针节点的链表

两个单链表相交的一系列问题

未完….待续 つづく