- 冒泡排序
一个list,起始位置为low,终止位置为high
冒泡关键是:相邻位置的数值比较,大的值装在后面的位置(内循环)。需要这样做len(list)-1次(外循环)
终止条件:迭代list结束,所以可以用for循环简单点
def bubbleSort(testlist):
low = 1
high = len(testlist)
for j in range(high-1):
for i in range(low, high-j):
if testlist[i] < testlist[i-1]:
testlist[i], testlist[i-1] = testlist[i-1], testlist[i]
return testlist
def main():
testlist = [2,3,4,10,5,1,12,7,8]
print(bubbleSort(testlist))
if __name__ == "__main__":
main()
2. 选择排序
原理和冒泡排序一致,但是是倒着判断,把最小的值一直往前推
3.插入排序
举个例子,插入排序就像抓牌,每抓到一张牌就需要判断插入手中已排序的牌中哪个位置。
插入关键:假设手中已有的排序【1,2,10】,现在抓到牌4,4应该放在哪里呢,一个个从右往左比较,4比10小吗?是的==》4比2小吗?不是==》放在2,10中间
终止条件:当准备插入的值4比2大时,终止;插入到第一个位置时终止
def insertSort(testlist):
low = 1
high = len(testlist)
for j in range(1, high):
temp = testlist[j]
for i in range(j,0,-1):
if temp < testlist[i-1]:
testlist[i],testlist[i-1] = testlist[i-1], testlist[i]
else:
break
return testlist
def main():
testlist = [2,3,4,10,5,1,12,7,8]
print(insertSort(testlist))
if __name__ == "__main__":
main()
4. 归并排序
我感觉就像是一个list,对半分成两个list,变成二叉树,直到每个节点的list只存储一个值为止
然后,再排序,回到一个排好序的list
def merge(left,right):
result = []
i = j =0
while i < len(left) and j < len(right):
if left[i] > right[j]:
result.append(right[j])
j += 1
else:
result.append(left[i])
i += 1
if i == len(left):
result.extend(right[j:len(right)]) #这边用extend,插入列表中的每个值,不能用append
if j == len(right):
result.extend(left[i:len(left)])
return result
def mergeSort(testlist):
if len(testlist) == 1:
return testlist
mid = len(testlist)//2
left = mergeSort(testlist[:mid])
right = mergeSort(testlist[mid:])
return merge(left, right)
def main():
testlist = [2,3,4,10,5,1,12,7,8]
print(mergeSort(testlist))
if __name__ == "__main__":
main()
![116e79547e4084756adada8c73162d22.png](https://img-blog.csdnimg.cn/img_convert/116e79547e4084756adada8c73162d22.png)
恩……思路见上图