时间复杂度
0(1)<0(logn)<0(n)<0(nlogn)<o(n2)<...<0(n!)
冒泡排序
算法:在数组x[n]中,从第一个数开始,拿x[i]和x[i+1]比较,如果x[i]>x[i+1],交换两个数,这样遍历一遍数组后,最大的元素排在了最后面;然后第二次比较剩下的n-1个数;直到完成所有的排序,由于每次都是把最大的排在最后面,称为冒泡排序。
def bubble_sort(mylist):
for i in range(len(mylist)):
for j in range(len(mylist)-1-i):
if mylist[j]<mylist[j+1]:
mylist[j],mylist[j+1]=mylist[j+1],mylist[j]
print (mylist)
bubble_sort([1,43,2,42,3443])
插入排序
第一次从第2个元素开始排序,key=x[2],与x[1]比较;第二次从第3个元素开始排序,先与x[2]比较,最差还要与x[1]比较。。。。。
def insert_sort(mylist):
for i in range(1,len(mylist)):
key = mylist[i]
j = i-1
while j >= 0:
if mylist[j] > key:
mylist[j],mylist[j+1] = mylist[j+1],mylist[j]
key = mylist[j]
j -= 1
else:
break
print (mylist)
insert_sort([88,25,93,54,17,9])
选择排序
算法:设置min=x[1],比较min和每1个元素,找到最小值后,交换min和该值,比较冒泡排序,找到最小值的索引,只交换1次。
def selectSort(mylist):
for i in range(len(mylist)):
min = i
for j in range(i+1,len(mylist)):
if mylist[min] > mylist[j]:
min = j
mylist[i],mylist[min] = mylist[min],mylist[i]
print (mylist)
selectSort([33,4,76,21,9,1])
快速排序
选择一个基数flag,其他每一个元素都和基数比较,小于基数的放基数左边,大于基数的放基数右边,然后再对基数左、右边序列做递归排序,直到序列只有1个数。
定义flag为x[n-1],i=-1,j=0;循环:比较x[j]与flag,当x[j]>flag,j+1,pass;当x[j]<flag,i=i+1,j+1,交换x[i]和x[j]。
def quickSort(mylist):
def pathSort(lista,startIndex,endIndex):
flag = lista[endIndex]
i = startIndex - 1
for j in range(startIndex,endIndex):
if lista[j] > flag:
pass
else:
i += 1
lista[i],lista[j] = lista[j],lista[i]
lista[i+1],lista[endIndex] = lista[endIndex],lista[i+1]
return i+1
def qSort(listb,startIndex,endIndex):
if startIndex >= endIndex:
return
middle = pathSort(listb,startIndex,endIndex)
qSort(listb,startIndex,middle-1)
qSort(listb,middle+1,endIndex)
return listb
print (qSort(mylist,0,len(mylist)-1))
quickSort([33,1,56,3,22,7,82])
二叉树
(1)基础知识
【二叉树】:二叉树是一棵特殊的树,二叉树每个节点最多有两个孩子结点,分别称为左孩子和右孩子。
【满二叉树】:高度为N的满二叉树有2^N- 1个节点的二叉树。
【完全二叉树】: 若设二叉树的深度为h,除第h 层外,其它各层(1~h-1) 的结点数都达到最大个数,第h 层所有的结点都连续集中在最左边,这就是完全二叉树。
先序遍历二叉树:根节点-左子树-右子树;
时间复杂度
排序法 | 最差时间分析 | 平均时间复杂度 | 稳定度 | 空间复杂度 |
冒泡排序 | O(n2) | O(n2) | 稳定 | O(1) |
快速排序 | O(n2) | O(n*log2n) | 不稳定 | O(log2n)~O(n) |
选择排序 | O(n2) | O(n2) | 稳定 | O(1) |
二叉树排序 | O(n2) | O(n*log2n) | 不一顶 | O(n) |
插入排序 | O(n2) | O(n2) | 稳定 | O(1) |
堆排序 | O(n*log2n) | O(n*log2n) | 不稳定 | O(1) |
希尔排序 | O | O | 不稳定 | O(1) |