冒泡排序 :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)