码迷,mamicode.com
首页 > 编程语言 > 详细

冒泡排序(Bubble sort)

时间:2018-10-28 20:37:26      阅读:102      评论:0      收藏:0      [点我收藏+]

标签:inline   ref   sort   不同   hang   com   代码   add   重复   

冒泡排序,有时也称为下沉排序,是一种简单的排序算法,它反复遍历要排序的列表,比较每对相邻的项目,如果它们的顺序错误则交换它们。 重复遍历列表,直到不需要交换,这表示列表已排序。 该算法是一种比较排序,以较小或较大元素“冒泡”到列表顶部的方式命名。 尽管算法很简单,但即使与插入排序相比,它对于大多数问题来说太慢而且不切实际。如果输入大部分是按顺序排列的,并且某些无序元素几乎就位,则冒泡排序可能是实用的。
如果列表中有n个数据,则在第一轮遍历中,需要进行n - 1次数据比较。遍历的原则为:比较相邻数据,若A[i] > A[i + 1](A为列表,i为索引),则发生数据交换。然后继续比较A[i + 1]和A[i + 2],直至A[n - 2]和A[n - 1]。最终,最大的元素会通过n - 1次比较,下沉到最后一个元素。按照这种思路,进行第二轮比较,但只比较到A[ n - 3]和A[n - 2](A[n - 1]已经在第一轮遍历后确定为最大元素),则第二轮需要比较n - 2次。最终,总的比较次数为 n -1 + n - 2 + n - 3 + ... + 1,结果为\(\frac{1}{2}n^2-\frac{1}{2}n\),其时间复杂度为O(\(n^2\))。
技术分享图片

算法实现

下面来用Python代码来简单的实现冒泡排序算法。思路很简单,第一层循环表示总共需要进行几层遍历,第一层遍历将最大的数转移到列表最后,第二次遍历将第二大的数转移到列表倒数第二的位置。总共循环n - 1次。内层循环依次比较相邻的数据大小,若靠前的数据比考后的数据大,则进行交换。

def bubble_sort(a_list):
    for pass_num in range(len(a_list) - 1, 0, -1):
        for i in range(pass_num):
            if a_list[i] > a_list[i + 1]:
                temp = a_list[i]
                a_list[i] = a_list[i + 1]
                a_list[i + 1] = temp

算法改进

冒泡排序通常认为是最低效的排序算法,因为在数据的最终位置确认前,都需要进行比较和交换。冒泡排序唯一的优势是若待排序列表已经排好序,则在第一轮遍历中若没有发生数据交换,则可以提前停止排序算法,将时间复杂度降为O(n)。下面是算法实现:和上面唯一不同的时,在每一轮遍历开始时,我们先用exchanegd变量假设该轮遍历未发生交换。在实际遍历过程中,若发生交换,则更改变量值,在该轮遍历结束时,判断本轮次遍历是否发生交换,若没有发生,则说明已经排序完毕。

def short_bubble_sort(a_list):
    for pass_num in range(len(a_list) - 1, 0, -1):
        exchanged = False
        for i in range(pass_num):
            if a_list[i] > a_list[i + 1]:
                temp = a_list[i]
                a_list[i] = a_list[i + 1]
                a_list[i + 1] = temp
                exchanged = True
        if not exchanged:
            break


总结:冒泡排序的效率算是所有排序算法中最低的,但若存在已经排序好的列表,则可以提前结束排序。值得注意的是,冒泡排序默认是稳定的排序算法,但若在比较的时候使用>=而不是>号时,相等的元素也发生了数据交换,从而稳定的算法变得不再稳定。可以查看排序算法的稳定性以详细了解。

冒泡排序(Bubble sort)

标签:inline   ref   sort   不同   hang   com   代码   add   重复   

原文地址:https://www.cnblogs.com/jeffrey-yang/p/9866698.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!