新手学习python(十三)算法
算法(Algorthm):一个计算过程,解决问题的方法。
时间复杂度是用来估计算法运行时间的一个式子(单位)。M个循环,复杂度就是N的M次方。(例如2个for循环,时间复杂度就是N的平方)
空间复杂度是用来评估算法占用内存大小的一个式子。
(1)列表排序:将无序的列表变成有序列表。
应用场景:各种榜单、各种表单、给二分排序用、给其他算法用
A、冒泡排序
思路:相邻的两个数两两对比,如果前面的数大于后面的数,则把前面的数和后面的交换。每一轮排序,最大的数置于最后。
def bubble_sort(li):
for i in range(len(li) -1):
exchange = False #加个优化
for j in range(len(li) -i -1):
if li[ j ] > li[ j+1 ]:
li[ j ],li [ j+1 ] = li [ j+1 ],li[ j ]
exchange = True #加个优化
if not exchange:
return #加个优化,如果冒泡排序中执行一趟而没有交换,则表示列表已经是有序状态,可以直接结束算法
B、选择排序
思路:一趟遍历记录最小的数,放到第一个位置;再一趟遍历记录剩余列表中最小的数,继续放置。
for select_sort(li):
for i in range(len(li) -1):
min_loc = i
for j in range(i+1,len(li)):
if li[ j ] < li[ min_loc ]:
min_loc = j
if min_loc != i:
li[ i ],li[ min_loc ] = li[ min_loc],li[ i ]
C、插入排序
思路:列表被分为有序区和无序区两个部分,最初有序区只有一个元素;每次从无序区选择一个元素,插入到有序区的位置,直到无序区变空。
def insert_sort(li):
for i in range(1,len(li)): #从1开始排序(注意:下标是从0开始)
tmp = li[ i ]
j = i -1
while j >= 0 and tmp < li[ j ]:
li[ j +1 ] = li[ j ]
j = j - 1
li[ j+1 ] = tmp
D、快速排序
思路:取一个元素P(第一个元素),使P归位;
列表被P分成两部分,左边都比P小,右边都比P大;
递归完成排序。
def quick_sort(data,left,right): #递归
if left < right:
mid = partition(data,left,right)
quick_sort(data,left,mid-1)
quick_sort(data,mid+1,right)
def partition(data,left,right): #使元素归位
tmp = data[left]
while left < right:
while left < right and data[right] >=tmp:
right -= 1
data[left] = data[right]
while left < right and data[left] <=tmp:
left +=1
data[right] = data[left]
data[left] = tmp
return left