算法
冒泡排序 :Bubble Sort 时间复杂度 : O(N*N)
说明: 将待排序的元素看作是竖着排列的“气泡”,较小的元素比较轻,从而要往上浮 import random a = [] for i in range(40): a.append(random.randrange(1,20)) for i in range(len(a) - 1): for j in range(len(a) - i - 1): if a[j] > a[j + 1]: a[j], a[j + 1] = a[j + 1], a[j] print(a)
插入排序 :Insertion sort 时间复杂度 : O(N*N) 说明: 逐一取出元素,在已经排序的元素序列中从后向前扫描,放到适当的位置 data_set = [ 9,1,22,31,45,3,6,2,11 ] smallest_num_index = 0 #初始列表最小值,默认为第一个 loop_count = 0 for j in range(len(data_set)): for i in range(j,len(data_set)): if data_set[i] < data_set[smallest_num_index]: #当前值 比之前选出来的最小值 还要小,那就把它换成最小值 smallest_num_index = i loop_count +=1 else: print("smallest num is ",data_set[smallest_num_index]) tmp = data_set[smallest_num_index] data_set[smallest_num_index] = data_set[j] data_set[j] = tmp print(data_set) print("loop times", loop_count)
选择排序 时间复杂度 : O(N*N) 说明: 首先在未排序序列中找到最小元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小元素,然后放到排序序列末尾。以此递归。 data_set = [ 9,1,22,31,45,3,6,2,11 ] smallest_num_index = 0 #初始列表最小值,默认为第一个 loop_count = 0 for j in range(len(data_set)): for i in range(j,len(data_set)): if data_set[i] < data_set[smallest_num_index]: #当前值 比之前选出来的最小值 还要小,那就把它换成最小值 smallest_num_index = i loop_count +=1 else: print("smallest num is ",data_set[smallest_num_index]) tmp = data_set[smallest_num_index] data_set[smallest_num_index] = data_set[j] data_set[j] = tmp print(data_set) print("loop times", loop_count)
希尔排序: 时间复杂度:O(n1+£) 0<£<1 说明:选择一个步长(Step) ,然后按间隔为步长的单元进行排序.递归,步长逐渐变小,直至为1. import random a = [] for i in range(10000): a.append(random.randrange(1,1000)) # 希尔运算 整理用的,把大概的顺序 整理好 ################################################ b = int(len(a)/2) while b >= 1: for i in range(len(a) - b): if a[i] > a[i + b]: a[i], a[i + b] = a[i + b], a[i] b = int(b/2) ################################################ f = 0 # 下面 while 循环 排序的时候 因为希尔运算做过整理,很多时候只判断下就可以了, ################################################ for i in range(len(a)): while i > 0 and a[i-1]>a[i]: a[i - 1], a[i] = a[i], a[i - 1] i -= 1 f+=1 #24966238 大约循环次数------希尔不给整理 #3765358 大约循环次数------希尔整理后 ################################################ print(f)
##################################################################### #堆排序 #儿子找父亲 a = [] for i in range(100): a.append(random.randrange(100)) lens = len(a) #总长度除以 2 减 1 就是他父亲索引 parent = int(lens/2-1) for ii in range(lens-1): last = 0 # 缩短循环长度 for i in range(lens-1-ii): #循环完剩下的长度 last = i+1 # 打印循环长度 # print(a[0:i]) #找到父亲的索引位置 减ii是找到缩短长度的 父亲索引 parent = int((lens-i- ii ) / 2 -1) #判断自己的索引位置是否大于父亲的索引 然后替换 if a[lens - i - 1-ii] > a[parent]: a[lens - i - 1 - ii],a[parent] = a[parent],a[lens - i - 1-ii ] #交换最大元素 把最大的元素衣服往后面排放lens-ii-1 a[0],a[last] = a[last],a[0] print(a) print(last) #####################################################################
#堆排序 从父亲找儿子 dataset = [random.randrange(50) for i in range(20)] # 从大往小循环 list 的长度 for i in range(len(dataset)-1,0,-1): print(i) #每次循环 把最大的值放到最前面 for index in range(int((i+1)/2),0,-1): p_index = index l_child_index = p_index *2 - 1 r_child_index = p_index *2 p_node = dataset[p_index-1] left_child = dataset[l_child_index] #如果 left chil 大于 parent if p_node < left_child: dataset[p_index - 1], dataset[l_child_index] = left_child, p_node p_node = dataset[p_index - 1] #如果 right chil 索引 大于 循环 list len if r_child_index < len(dataset[0:i+1]): right_child = dataset[r_child_index] if p_node < right_child: dataset[p_index - 1] , dataset[r_child_index] = right_child,p_node p_node = dataset[p_index - 1] #把list 的第一个值 放到最后 dataset[0],dataset[i] = dataset[i],dataset[0] print(dataset)
#快排 #最快的排序 def quick_sort(array, left, right): if left >= right: return low = left high = right key = array[low] # 第一个值 while low < high: # 只要左右未遇见 while low < high and array[high] > key: # 找到列表右边比key大的值 为止 high -= 1 # 此时直接 把key(array[low]) 跟 比它大的array[high]进行交换 array[low] = array[high] array[high] = key while low < high and array[low] <= key: # 找到key左边比key大的值,这里为何是<=而不是<呢?你要思考。。。 low += 1 # array[low] = # 找到了左边比k大的值 ,把array[high](此时应该刚存成了key) 跟这个比key大的array[low]进行调换 array[high] = array[low] array[low] = key quick_sort(array, left, low - 1) # 最后用同样的方式对分出来的左边的小组进行同上的做法 quick_sort(array, low + 1, right) # 用同样的方式对分出来的右边的小组进行同上的做法 if __name__ == '__main__': array = [random.randrange(10000) for i in range(10000)] quick_sort(array, 0, len(array) - 1) print("-------final -------") print(array)
#二分算法 #!/usr/bin/python3.4 # -*- coding: utf-8 -*- #PS: 最小值0 最大值10 k为 7 # 中间值 5 < k7 # 最小值 5+1 + 最大值 10 = 中间值 8 # 中间值 k7 < 8 # 最小值 6 + 最大值 8-1 = 中间值 6 # 中间值 6 < k7 # 最小值 6+1 最大值 7 = 中间值 7 # 中间值 7 == k7 def BinarySearch(arr, key): #最小值 mins = 0 #最大值 maxs = len(arr) - 1 if key in arr: # 建立一个死循环,直到找到key i = 0 while True: #得到每次查找次数 i += 1 #得到中间值 center = int((mins + maxs) / 2) #如果key 小于 中间值 那么最大值就等于 中间值 的下一位 最小值不变 #为什么最小值 不变呢,因为有可能等于最小值 if key < arr[center]: maxs = center - 1 #如果key 大于 中间值 那么最小值就等于中间值的 上一位, 最大值不变 #为什么最大值 不变呢,因为有可能等于最大值 elif arr[center] < key: mins = center + 1 # key在数组中间 elif arr[center] == key: print(str(key) + "在数组里面的第" + str(center) + "个位置" + '----%s'%i) return arr[center] else: print("没有该数字!") if __name__ == "__main__": arr = [] for i in range(10000000): arr.append(i) while True: key = input("请输入你要查找的数字:") if key == " ": print("谢谢使用!") break else: BinarySearch(arr, int(key))
#后序遍历 class Tree(object): def __init__(self,data=None,left=None,right=None): self.data = data self.left = left self.right = right class Btree(object): def __init__(self,root): self.root = root #前序遍历 根节点 > 左子树 > 右子树 def perOrder(self,node): print(node.data) if type(node.left) == type(""): print(node.left) elif node.left is None: pass elif type(node.left) == type(self.root): self.perOrder(node.left) if type(node.right) == type(""): print(node.right) elif node.right is None: pass elif type(node.right) == type(self.root): self.perOrder(node.right) return #中序遍历 左子树 > 根节点 > 右子树 def perIrder(self, node): #如果左子树 是字符串类型 就打印 if type(node.left) == type(""): print(node.left) #如果左子树是空 什么都不干 elif node.left is None: pass #如果是对象 那么就进入 elif type(node.left) == type(self.root): self.perIrder(node.left) print(node.data) if type(node.right) == type(""): print(node.right) elif node.right is None: pass elif type(node.right) == type(self.root): self.perIrder(node.right) #最后返回 return #后序遍历 左子树 > 右子树 > 根节点 def perBrder(self, node): if type(node.left) == type(""): print(node.left) elif node.left is None: pass elif type(node.left) == type(self.root): self.perBrder(node.left) if type(node.right) == type(""): print(node.right) elif node.right is None: pass elif type(node.right) == type(self.root): self.perBrder(node.right) print(node.data) return n1 = Tree('n1','n1-left','n1-right') n2 = Tree('n2',n1,'n2-right') n3 = Tree('n3','n3-left',n2) n4 = Tree('n4','n4-left','n4-right') n5 = Tree('n5',n4,n3) n6 = Tree('n6','n6-left',n5) n7 = Tree('n7',n6,'n7-right') n8 = Tree('n8',) n9 = Tree('root',n7,n8) obj = Btree(n9) obj.perBrder(obj.root)