您的位置:首页 > 编程语言 > Python开发

Python - 冒泡排序

2019-01-03 21:31 120 查看
版权声明:欢迎转载,请注明出处 https://blog.csdn.net/beyondlee2011/article/details/85722163

1 冒泡算法

        

冒泡排序(Bubble Sort)
,是一种计算机科学领域的较简单的排序算法,它属于交换排序,主要的方式是通过两辆比较,交换位置,如同水泡咕嘟咕嘟往上冒一样,需要称他为’冒泡排序’。

2 具体的排序方法

        它重复地走访过要排序的元素列,依次比较两个相邻的元素,按照一定的顺序(升序/降序)进行比较,如果是升序,那么当右边的数小于左边的数,那么就会进行交换,直到没有相邻的元素需要交换后停止。此时表示该列元素已经排序完成。

3 分析

        根据定义,我们知道最少需要两个循环,第一个循环遍历所有元素,内层循环则进行两两比较及换位的操作。

升序分析:
初始列表:[9,1,3,2,6,8,7,4,5]
第一趟,第一次:比较9和1的大小情况,9大于1,需要调换位置[1,9,3,2,6,8,7,4,5]
第一趟,第二次:比较9和3的大小情况,9大于3,需要调换位置[1,3,9,2,6,8,7,4,5]
第一趟,第三次:比较9和2的大小情况,9大于2,需要调换位置[1,3,2,9,6,8,7,4,5]
第一趟,第四次:比较9和6的大小情况,9大于6,需要调换位置[1,3,2,6,9,8,7,4,5]
第一趟,第五次:比较9和8的大小情况,9大于8,需要调换位置[1,3,2,6,8,9,7,4,5]
第一趟,第六次:比较9和7的大小情况,9大于7,需要调换位置[1,3,2,6,8,7,9,4,5]
第一趟,第七次:比较9和4的大小情况,9大于4,需要调换位置[1,3,2,6,8,7,4,9,5]
第一趟,第八次:比较9和5的大小情况,9大于5,需要调换位置[1,3,2,6,8,7,4,5,9]
第一趟确定了一个最大数,放在最右边。接下来在除他以外的未排序空间进行第二趟循环,确认第二大的数放在最油边

第二趟初始列表:[1,3,2,6,8,7,4,5,9]
第二趟,第一次:比较1和3的大小情况,1小于3,不用调换位置[1,3,2,6,8,7,4,5,9]
第二趟,第二次:比较3和2的大小情况,3大于2,需要调换位置[1,2,3,6,8,7,4,5,9]
第二趟,第三次:比较3和6的大小情况,3小于6,不用调换位置[1,2,3,6,8,7,4,5,9]
第二趟,第四次:比较6和8的大小情况,6小于8,不用调换位置[1,2,3,6,8,7,4,5,9]
第二趟,第五次:比较8和7的大小情况,8大于7,需要调换位置[1,2,3,6,7,8,4,5,9]
第二趟,第六次:比较8和4的大小情况,8大于4,需要调换位置[1,2,3,6,7,4,8,5,9]
第二趟,第七次:比较8和5的大小情况,8大于5,需要调换位置[1,2,3,6,7,4,5,8,9]
第二趟找到了第二大的书,放在了第一趟找出的最大数的左边。

4 实现

        通过观察可以得知,外层循环每次都可以确定一个最大数,放在最右边,而内层循环,判断的次数是依次减少的,因为上一堂确定的最大数,下一趟就不必再进行对比,根据这个情况编写代码进行排序。

lst = [1,9,3,2,6,8,7,4,5]
length = len(lst)
for i in range(length):
flag = False          # 退出开关
for j in range(length - i - 1):
if lst[j] > lst[j+1]:
flag = True  # 如果本次交换了位置,开关位置为关
lst[j], lst[j+1] = lst[j+1], lst[j]
if not flag:break   # 当开关为开时,表示本次判断没有交换,没有交换,则认为已经排序完毕
print(lst)

5 总结

  • 冒泡法需要数据一轮一轮的比较
  • 可以设定一个标记判断是否有数据交换发生,如果没有发生交换,可以结束排序,因为此时已经排序完毕了,如果发生了交换,那么就需要继续下一轮排序了
  • 最差的排序情况是,出事顺序与目标顺序完全相反,遍历次数1,…n-1之和: n(n-1)/2
  • 最好的排序情况是,初始顺序与目标顺序完全相同,遍历次数n-1
  • 时间复杂度为O(n**2)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: