; ;

算法之------冒泡算法及冒泡算法改进点

 

1.冒泡算法的原理(搬运百度百科)

比较相邻的元素。如果第一个比第二个大,就交换他们两个。
对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。
针对所有的元素重复以上的步骤,除了最后一个。
持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。

冒泡代码


def bubbling_sort(array):
for i in range(len(array)-1):
for j in range(len(array) - i-1):
if array[j] > array[j + 1]:
array[j], array[j + 1] = array[j + 1], array[j]
return array

if __name__ == '__main__':
array = [10, 17, 50, 7, 30, 24, 27, 45, 15, 5, 36, 21]
  print(array)
  bubbling_sort(array)
  print(array)

 

排序的过程如下:第一行是原始数据,方便查看

 

 

 以第一次排序顺序举例:

10比17小,10位置不变-----》17比50 小,17位置不变----》 50 比7大,7与50交换位置----》    50比30大,30与50交换位置-----》 50比24大,50与24交换位置 ---》50比27大,50与27交换位置----》50比45大,50与45交换位置----》50比15大,50与15交换位置---》50比5大,50与5交换位置----》50比36大,50与36交换位置----》50比21大,50与21交换位置, 第一次排序把最大的数给找出来了

 其他逻辑也是如此

 

 2.冒泡优化点

可能也有一些列表是有序的,那其实就没有必要做一些排序。

如这样的列表,array=[9, 8, 7, 1, 2, 3, 4, 5],见下图排序列表顺序

 

 

 按照以前代码那么排序是要经历8次排序,也就是列表的长度次数,那这里其实可以对冒泡建立一个标志位,如果发现是一个有序的,就不用进行排序,如下代码

def bubbling_sort_excange(array):
for i in range(1, len(array)):
exchange=False
for j in range(0, len(array) - i):
if array[j] > array[j + 1]:
array[j], array[j + 1] = array[j + 1], array[j]
exchange=True
print(array)
if not exchange:
return
return array
if __name__ == '__main__':
  array=[9, 8, 7, 1, 2, 3, 4, 5]
  bubbling_sort_excange(array)
  print(array

在来看看它的执行次数,只做了5次的排序

 

posted @ 2022-03-25 20:10  做梦的人-  阅读(54)  评论(0编辑  收藏  举报