三大排序算法
冒泡排序法:最原始的方式,相邻两个数比较,交换位置n轮n次.
**快速排序法:**比第一个数大的就放到右边去,小的就放到左边去.左右再分别进行同样的操作:运气好logn次就解决,运气最差n轮n次.
**归并排序法:**将数列分成左右两列,直至分成1个数字和左1数字,右1数字.然后合并,合并时小的放在前面.
代码与注释如下:
begin="3210"
for i in begin:
print('倒计时:{}'.format(i))
print("\n\n"+"序章:先生成一个随机序列".center(50,"-")+"\n\n")
#-------------------序章:先生成一个随机序列-------------------
import random
def randlist(n):
lst = []
for i in range(n):
lst.append(random.randrange(1000))
#randrange和randint的主要区别就是ranrange是惯例,randint可以随即到起始数值
return lst
if __name__ == '__main__':
lst = randlist(10)
print(lst)
#print(random.randint.__doc__)
#Return random integer in range [a, b], including both end points.
#print(random.randrange.__doc__)
'''Choose a random item from range(start, stop[, step]).
This fixes the problem with randint() which includes the
endpoint; in Python this is usually not what you want.'''
print("\n\n"+"第一种:Bubble冒泡排序法".center(50,"-")+"\n\n")
#--------------------第一种:冒泡排序法---------------------
#比较相邻的两个位置,交换大数到后面,n个数一轮比较n-1次下来就是最后面一个数是最大数.
#第二轮最后一个数就不用再比较了,比较前面的n-1个数,倒数第二个就变成了最大数
#以此类推,一直到第n轮,比较0次.剩下第一个数,就不用再比较了,返回自身就可以了.
#可以看到有两个参数:总共n个数总共比较了n-1轮.第i轮,比较n-i次.
lst = randlist(10)
print(lst)
def bubble_sort():
for i in range(1,len(lst)):
for j in range(len(lst)-i):
if lst[j]>=lst[j+1]:
lst[j],lst[j+1]=lst[j+1],lst[j]#交换赋值
#print("第{}轮,比较了{}次,返回的列表是:{}".format(i,len(lst)-i,lst),end="\n")
return lst
if __name__ == '__main__':
print("冒泡排序结果是:\n%s"%bubble_sort())
print("\n\n"+"第二种:Quick快速排序法".center(50,"-")+"\n\n")
#--------------------第二种:快速排序法---------------------
#二\快速排序法,用递归函数解决,小的在左边,大的放右边.
#递归一直调用自己,直至只剩自己,左右都没有数字.
lst = randlist(10)
print(lst)
def quick_sort(lst):
if len(lst) <= 1:#只有一个数或者没有数的时候,就返回自身结束.
return lst
else:
leftlst=[]
rightlst=[]
for i in lst[1:]:
if i <= lst[0]:
leftlst.append(i)
else:
rightlst.append(i)
return quick_sort(leftlst)+[lst[0]]+quick_sort(rightlst)
if __name__ == '__main__':
print("快速排序结果是:\n{}".format(quick_sort(lst)))
print("\n\n"+"第三种:Merge归并排序法".center(50,"-")+"\n\n")
#------------------第三种:Merge归并排序法------------------
#将数据分成左右两列,左右再不断分列,分别排序,左右两列再不断的调用函数自己分列
#只有一个数时,就不能再分列了.就开始合并成有序数列
#根据左右大小比较,新数列先加数值较小的数
lst = randlist(10)
print(lst)
def merge_sort(lst):
if len(lst) <= 1:
return lst
else:
middle = len(lst)//2
left,right = lst[0:middle],lst[middle:]
return mergelst(merge_sort(left),merge_sort(right))
def mergelst(left,right):
mlst=[]
while left and right:
if left[0] >= right[0]:
mlst.append(right.pop(0))
else:
mlst.append(left.pop(0))
while left:
mlst.append(left.pop(0))
while right:
mlst.append(right.pop(0))
return mlst
print("归并排序法的结果是:%s"%merge_sort(lst))
huibif的学习笔记