suliveevil Life is Short!

Bubble Sort 冒泡排序

2018-02-01
suliveevil

冒泡排序算法

冒泡排序(Bubble sort):时间复杂度O(n^2) 交换排序的一种。其核心思想是:两两比较相邻记录的关键字,如果反序则交换,直到没有反序记录为止。

#!/usr/bin/env python
# -*- coding:utf-8 -*-

class SQList:
    def __init__(self, lis=None):
        self.r = lis

    def swap(self, i, j):
        """定义一个交换元素的方法,方便后面调用。"""
        temp = self.r[i]
        self.r[i] = self.r[j]
        self.r[j] = temp
    
    def bubble_sort_simple(self):
        """
        最简单的交换排序,时间复杂度O(n^2)
        """
        lis = self.r
        length = len(self.r)
        for i in range(length):
            for j in range(i+1, length):
                if lis[i] > lis[j]:
                    self.swap(i, j)
    
    def bubble_sort(self):
        """
        冒泡排序,时间复杂度O(n^2)
        """
        lis = self.r
        length = len(self.r)
        for i in range(length):
            j = length-2
            while j >= i:
                if lis[j] > lis[j+1]:
                    self.swap(j, j+1)
                j -= 1
    
    def bubble_sort_advance(self):
        """
        冒泡排序改进算法,时间复杂度O(n^2)
        设置flag,当一轮比较中未发生交换动作,则说明后面的元素其实已经有序排列了。
        对于比较规整的元素集合,可提高一定的排序效率。
        """
        lis = self.r
        length = len(self.r)
        flag = True
        i = 0
        while i < length and flag:
            flag = False
            j = length - 2
            while j >= i:
                if lis[j] > lis[j + 1]:
                    self.swap(j, j + 1)
                    flag = True
                j -= 1
            i += 1
    
    def __str__(self):
        ret = ""
        for i in self.r:
            ret += " %s" % i
        return ret

if __name__ == '__main__':
    sqlist = SQList([4,1,7,3,8,5,9,2,6])
    # sqlist.bubble_sort_simple()
    # sqlist.bubble_sort()
    sqlist.bubble_sort_advance()
    print(sqlist)

参考资料

《大话数据结构》

基于python的七种经典排序算法 - 刘江liujiangblog.com


Similar Posts

上一篇 Git gitignore

Comments