把无序列表[37,99,73,48,47,40,40,25,99,51]升序排序。
一、冒泡法
冒泡法属于交换排序,从第一个开始,两两比较,交换位置,如同水泡向上冒,每轮比较会把当前最大值推到列表尾部,每轮确定一个数的位置。直到确定每一个数的位置。时间复杂度O(n**2)。
代码实现:
def buble(lst):
lenth = len(lst)
for i in range(lenth):
for j in range(lenth-i-1):
if lst[j]>lst[j+1]:
lst[j],lst[j+1] = lst[j+1],lst[j]
return lst
优化:如果发现一轮比较完成之后一次交换都没有发生没有发生,说明顺序已正确,无需再交换。代码:
def buble(lst):
lenth = len(lst)
for i in range(lenth):
flag = False
for j in range(lenth-i-1):
if lst[j]>lst[j+1]:
lst[j],lst[j+1] = lst[j+1],lst[j]
flag = True
else:
if flag == False:
break
print(lst)
return lst
二、简单选择排序
简单选择排序属于选择排序,从第一个开始遍历,找到本次遍历的极值放置在固定的位置,这个固定位置一般是指某一端。(通过比较记录最大数的索引,然后通过索引固定最大数在某一端,然后剩下数比较),时间复杂度O(n**2)
上代码:
def select(lst):
lenth = len(lst)
for i in range(lenth):
minindex = i
for j in range(i+1,lenth):
if lst[minindex]>lst[j]:
minindex = j
if minindex != i:
lst[minindex],lst[i] = lst[i],lst[minindex]
print(lst)
return lst
三、插入排序
插入算法是稳定排序算法。
使用在小规模数据比较。非常适用于新元素加入已排列好的list。
原理(升序):认为第一个数为一个有顺序的List,从第2个数开始取值i,取到之后与它前面的数比较,比i大该数则右移,直到找不到比i大的数,把i插入到循环停止的位置。
每一轮结束,都会得到一个从开始到待比较数位置的有序序列。
上代码:
def insert(lst):
lenth = len(lst)
for i in range(1,lenth):
val = lst[i]
j = i-1
while val < lst[j] and j>=0:
lst[j+1] = lst[j]
j -= 1
lst[j+1] = val
print(lst)
return lst
四、堆排序
待完善
浙公网安备 33010602011771号