1.冒泡排序
def bubble_sort(data_list): """ 冒泡排序: 首先拿到第一个元素,和它第二个作比较,把较大的数放在右边 第二个再和第三个比较。。。。一轮下来,最后一个就是最大的数 再一轮,倒数第二个也变成有序的......最终都变成有序的 :param data_list: :return: """ # [6,3,2,7,8,9,5,1,4] # [] for i in range(len(data_list)): flag = True # 做一个标记,看是否在冒泡的过程中发生数据交换 for j in range(len(data_list) - i - 1): # [6,3]做对比,换成[3,6] ,然后 [6,2] 做对比...... if data_list[j] > data_list[j + 1]: data_list[j], data_list[j + 1] = data_list[j + 1], data_list[j] flag = False if flag: # 如果没有发生数据交互,那么数据本身就是排好序的 break
2.选择排序
def select_sort(data_list): """ 选择排序: 不断找到最小的(找最大的也是可以的) 首先拿到第一个,然后发现比它小的,记住下标。循环一轮,找到最小的数的位置 和 最左边的数交换位置 然后从第二个开始....和第二个交换位置, .....开始变得越来越有序 :param data_list: :return: """ # [6,3,2,7,8,9,5,1,4] for i in range(len(data_list)): # 做一个标记 flag = True # 当前元素无序区的第一个元素是最小的 min_loc = i for j in range(i + 1, len(data_list)): # 循环遍历无序区 if data_list[j] < data_list[min_loc]: # 如果无序区的元素比假定的小,那将该元素标记为最小的 min_loc = j flag = False # 循环遍历结束,将无序区的最小元素和第一个元素的位置做一下交换 if flag: continue data_list[i], data_list[min_loc] = data_list[min_loc], data_list[i]def select_sort(data_list): """ 选择排序: 不断找到最小的(找最大的也是可以的) 首先拿到第一个,然后发现比它小的,记住下标。循环一轮,找到最小的数的位置 和 最左边的数交换位置 然后从第二个开始....和第二个交换位置, .....开始变得越来越有序 :param data_list: :return: """ # [6,3,2,7,8,9,5,1,4] for i in range(len(data_list)): # 做一个标记 flag = True # 当前元素无序区的第一个元素是最小的 min_loc = i for j in range(i + 1, len(data_list)): # 循环遍历无序区 if data_list[j] < data_list[min_loc]: # 如果无序区的元素比假定的小,那将该元素标记为最小的 min_loc = j flag = False # 循环遍历结束,将无序区的最小元素和第一个元素的位置做一下交换 if flag: continue data_list[i], data_list[min_loc] = data_list[min_loc], data_list[i]
3.插入排序
def insert_sort(data_list): """ 插入排序:有点像抓牌,插牌 手中刚开始有一张牌,一张牌当然是有序的 再把第二张牌拿到手里 和 第一张比较是否需要交换位置,然后手中的两张牌变得有序了 再拿第三张牌,和手中的牌 从右边开始比较 ,如有需要交换位置 ...... 所有的牌都到手里,手里的牌都变成有序的 :param data_list: 将数据传递过来 :return: 返回有序的list """ for i in range(1, len(data_list)): # 从第二数据开始 for j in range(0, i): # 它左边的数字都是有序的 if data_list[i] < data_list[j]: # 如果这数字比左边的某个数字小,则交换这两个数字的位置 data_list[i], data_list[j] = data_list[j], data_list[i]
4.快速排序
def qsort(seq): if seq==[]: return [] else: pivot=seq[0] lesser=qsort([x for x in seq[1:] if x<pivot]) greater=qsort([x for x in seq[1:] if x>=pivot]) return lesser+[pivot]+greater
5.广度遍历和深度遍历二叉树
## 14 二叉树节点 class Node(object): def __init__(self, data, left=None, right=None): self.data = data self.left = left self.right = right tree = Node(1, Node(3, Node(7, Node(0)), Node(6)), Node(2, Node(5), Node(4))) ## 15 层次遍历 def lookup(root): stack = [root] while stack: current = stack.pop(0) print current.data if current.left: stack.append(current.left) if current.right: stack.append(current.right) ## 16 深度遍历 def deep(root): if not root: return print root.data deep(root.left) deep(root.right) if __name__ == '__main__': lookup(tree) deep(tree)
6.求最大树深
def maxDepth(root): if not root: return 0 return max(maxDepth(root.left), maxDepth(root.right)) + 1
7.求两颗树是否相等
def isSameTree(p, q): if p == None and q == None: return True elif p and q : return p.val == q.val and isSameTree(p.left,q.left) and isSameTree(p.right,q.right) else : return False
8.单链表逆置
class Node(object): def __init__(self, data=None, next=None): self.data = data self.next = next link = Node(1, Node(2, Node(3, Node(4, Node(5, Node(6, Node(7, Node(8, Node(9))))))))) def rev(link): pre = link cur = link.next pre.next = None while cur: tmp = cur.next cur.next = pre pre = cur cur = tmp return pre root = rev(link) while root: print root.data root = root.next
9.二分查找
def binarySearch(l, t): low, high = 0, len(l) - 1 while low < high: print low, high mid = (low + high) / 2 if l[mid] > t: high = mid elif l[mid] < t: low = mid + 1 else: return mid return low if l[low] == t else False if __name__ == '__main__': l = [1, 4, 12, 45, 66, 99, 120, 444] print binarySearch(l, 12) print binarySearch(l, 1) print binarySearch(l, 13) print binarySearch(l, 444)
10.交叉链表求交点
def __init__(self, x): self.val = x self.next = None def node(l1, l2): length1, lenth2 = 0, 0 # 求两个链表长度 while l1.next: l1 = l1.next length1 += 1 while l2.next: l2 = l2.next length2 += 1 # 长的链表先走 if length1 > lenth2: for _ in range(length1 - length2): l1 = l1.next else: for _ in range(length2 - length1): l2 = l2.next while l1 and l2: if l1.next == l2.next: return l1.next else: l1 = l1.next l2 = l2.next