这里总结些python中的数据结构和常用的排序算法。
数据结构
栈
在python中并没有栈这个数据类型,所以需要自己进行定义和封装。其实也就是通过列表来实现栈的操作。这里就定义了一个栈和栈的基本操作。
但是需要注意的是:这里使用list作为栈,是没有进行同步的,特别是在多线程中,可能会出现并发的问题,这里有待验证。
1 | class Stack(objects): |
树
二叉树的创建:
1 | # -*- coding: utf-8 -*- |
链表
链表的创建和打印:
1 | # -*- coding:utf-8 -*- |
算法题1
输入两个 单调递增 的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足 单调不减 规则。牛客网《剑指offer》
1 | # 解体思路来自左程云《程序员代码面试指南》P84 |
算法
常见排序算法
- 冒泡排序(O^2): 冒泡排序是利用两层循环,不断地将数据中比较大或比较小的数字交换到最上面来,看上去就像水中的气泡冒出来一样。
冒泡排序是稳定的。以下提供三种方法,第一种是将小数先冒出来,第二种是将大数先冒出来,第三种提供的是一种优化思路:设置了一个标志,某一趟排序时并没有进行数据交换,则说明所有数据已经有序。这样做是优化了当数组有序的时候,进行的不必要遍历
1 | def bubble_soft_1(data): |
- 选择排序(O^2):每一次循环从乱序部分中寻找出最大的那个数字,交换到有序部分的最后去,直到列表都有序。
1 | def selection_sort(data): |
总共的运行次数和冒泡排序一样,n(n-1)/2次,但是由于交换次数少得多了,速度也就更快了。
- 插入排序(O^2): 将每一个无序部分的元素插入到有序部分中。
1 | def insertion_sort1(data): |
在数组元素比较少的时候,用几行就能实现的这个算法看上去很简洁,但一旦数量上去了,每一轮插入需要比较的次数越来越多,拖慢了速度。
插入排序的两种实现方式的时间复杂度相同,但是后面一种方法的代码复杂度比较低
- 希尔排序(n^2)
1 | def shell_sort(data): |
- 快速排序(nlogn)
快速排序是对冒泡排序的一种改进。通过一趟排序将要排序的数据分割独立的两部分,一部分所有数据都比另一部分的所有数据都要小,然后再按照此方法对这两个部分分别进行快速排序,整个过程可以递归进行,以达到整个数据变成有序序列。
首先选取一个数据(通常选用数组的第一个数作为关键数据),然后所有比它小的数都放到它前面,所有比它大的数都放到它后面,这个过程成为一趟快速排序。
1 | def quick_sort(data): |
快速排序也不是稳定的。最坏的情况下复杂度也达到: O(n^2)