美文网首页
排序三人组:冒泡、选择与插入

排序三人组:冒泡、选择与插入

作者: kingron | 来源:发表于2019-10-12 16:47 被阅读0次

    三个算法的时间复杂度都为 O(n2)。

    冒泡排序

    遍历列表的每一个值,如果当前值大于当前值的后面一个值,则交换两个值的位置,使较大的值处于后面。重复遍历直到排好序为止。
    算法实现:

    def bubble_sort(li):
        """冒泡排序
        遍历 len(li)-1 趟 (从0开始)
        """
        cycles = len(li) - 1
        for i in range(cycles):
            is_exchanged = False
            for j in range(cycles - 1):
                if li[j] > li[j+1]:
                    li[j], li[j+1] = li[j+1], li[j]
                    if not is_exchanged:
                        is_exchanged = True
            if not is_exchanged:
                break
    

    选择排序

    遍历列表,找到最小的值,将它放到一个新的位置。如此反复直到剩下的所有值都转移到新位置为止。算法实现:

    def select_sort(li):
        """选择排序
        遍历 len(li) - 1 趟 (从0开始)"""
        li_length = len(li)
        for i in range(li_length-1):
            
            # 找到并记录最小元素所在位置
            min_loc = i     
            for j in range(i+1, li_length):
                if li[j] < li[min_loc]:
                    min_loc = j
            
            if min_loc != i:
                li[min_loc], li[i] = li[i], li[min_loc]
    

    插入排序

    插入排序类似于摸牌,每当摸到一张新牌时,就和手里面的牌依次进行比较,如果小于被比较的牌,则将被比较的牌往后移一位,直到大于被比较的牌或前面没有牌可以比较时(即摸到的牌为当前手里牌最小的牌),将摸到的牌插入到当前位置的后一位。算法实现:

    def insert_sort(li):
        """插入排序
        类似于打牌,从列表中依次取一张牌
        用获取的牌与手中的牌依次对比
        如果获取的牌比对比的牌小,则将它插入到对比的牌的前面
        """
        for i in range(1, len(li)):
            # 假定第一张牌为手中的牌
            # i 表示获取的牌的下标
            tmp = li[i]
            # j 表示手里牌的下标
            j = i - 1
            while j >= 0 and li[j] > tmp:
                li[j+1] = li[j]
                j -= 1
            li[j+1] = tmp
    

    相关文章

      网友评论

          本文标题:排序三人组:冒泡、选择与插入

          本文链接:https://www.haomeiwen.com/subject/yltapctx.html