冒泡排序的思想:
遍历列表,从头开始,将相邻的2个数字进行比较,将较大的数字放在右边,这样一趟下来,
最后一个数字就是这一趟中的最大值,重复上述步骤,
需要注意的点:
需要遍历的趟数
每趟需要交换的次数 (建议画个图)
代码:
def bubblo_sort_simple(li):
'''原地排序
'''
for i in range(len(li) - 1): # 遍历的趟数, 第几趟.
for j in range(len(li)- i - 1): # 每趟需要比较的次数
if li[j] > li[j+1]:
li[j], li[j+1] = li[j+1], li[j]
print(li)
li = [9,8,7,6,5,4,3,2,1]
print(li)
bubblo_sort_simple(li)
li = [9,8,7,6,5,4,3,2,1]
#li = [1,2,3,4,5,6,7,8,9]
print(li)
bubblo_sort_simple(li)
[9, 8, 7, 6, 5, 4, 3, 2, 1] [8, 7, 6, 5, 4, 3, 2, 1, 9] [7, 6, 5, 4, 3, 2, 1, 8, 9] [6, 5, 4, 3, 2, 1, 7, 8, 9] [5, 4, 3, 2, 1, 6, 7, 8, 9] [4, 3, 2, 1, 5, 6, 7, 8, 9] [3, 2, 1, 4, 5, 6, 7, 8, 9] [2, 1, 3, 4, 5, 6, 7, 8, 9] [1, 2, 3, 4, 5, 6, 7, 8, 9]
## 列表已经排好顺序了
li = [1,2,3,4,5,6,7,8,9]
print(li)
bubblo_sort_simple(li)
[1, 2, 3, 4, 5, 6, 7, 8, 9]
[1, 2, 3, 4, 5, 6, 7, 8, 9]
[1, 2, 3, 4, 5, 6, 7, 8, 9]
[1, 2, 3, 4, 5, 6, 7, 8, 9]
[1, 2, 3, 4, 5, 6, 7, 8, 9]
[1, 2, 3, 4, 5, 6, 7, 8, 9]
[1, 2, 3, 4, 5, 6, 7, 8, 9]
[1, 2, 3, 4, 5, 6, 7, 8, 9]
[1, 2, 3, 4, 5, 6, 7, 8, 9]
冒泡排序代码优化:
def bubblo_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
print(li)
if not exchange:
return li
li = [9,8,7,6,5,4,3,2,1]
#li = [1,2,3,4,5,6,7,8,9]
print(li)
bubblo_sort(li)
PS E:gitAlgorithm冒泡排序> python .demo.py [1, 2, 3, 4, 5, 6, 7, 8, 9] [1, 2, 3, 4, 5, 6, 7, 8, 9] PS E:gitAlgorithm冒泡排序> python .demo.py [9, 8, 7, 6, 5, 4, 3, 2, 1] [8, 7, 6, 5, 4, 3, 2, 1, 9] [7, 6, 5, 4, 3, 2, 1, 8, 9] [6, 5, 4, 3, 2, 1, 7, 8, 9] [5, 4, 3, 2, 1, 6, 7, 8, 9] [4, 3, 2, 1, 5, 6, 7, 8, 9] [3, 2, 1, 4, 5, 6, 7, 8, 9] [2, 1, 3, 4, 5, 6, 7, 8, 9] [1, 2, 3, 4, 5, 6, 7, 8, 9]
从优化的代码中可以看出,如果序列已经是有序的,只需要运行一趟. (上面的代码默认升序,如果要降序,修改下比较代码)