zoukankan      html  css  js  c++  java
  • 数据结构与算法: 冒泡/插入/选择排序

    今天主要整理了时间复杂度为O(n**2)的几个排序代码, 虽然这几个不经常使用, 但是对初学者训练自己的思维还是有帮助的. 希望能对大家有所帮助

    1.冒泡排序

    • 时间复杂度:O(n**2)
    • 空间复杂度: O(1)
    • 排序稳定性: 稳定
    # coding:utf-8
    
    def bubble_1(nums):
        """
        把最小的向前移动
        :param nums:
        :return:
        """
        length = len(nums)
        for i in range(length):
            for j in range(i + 1, length):
                if nums[i] > nums[j]:
                    nums[i], nums[j] = nums[j], nums[i]
        print(nums)
    
    
    def bubble_2(nums):
        """
        把最大的向后移动
        :param nums:
        :return:
        """
        stop = True  # 一个信号, 如果数组原本就是有序的, 则是O(n)
        length = len(nums)
        for i in range(length):
            for j in range(length - i - 1):
                if nums[j] > nums[j + 1]:
                    nums[j], nums[j + 1] = nums[j + 1], nums[j]
                    stop = False
            if stop:
                break
        print(nums)
    
    
    if __name__ == "__main__":
        nums_1 = [4, 5, 2, 6, 1, 8]
        bubble_1(nums_1)
        print("----")
        nums_2 = [4, 5, 2, 6, 1, 8]
        bubble_2(nums_2)
    
    

    2.插入排序

    是一个动态的排序过程, 即动态的往有序集合中添加数据, 最终保持集合有序

    思路: 把数组分为两个区间, 已排序区间待排序区间. 初始已排序区间就是数组的第一个元素, 之后遍历待排序区间所有元素, 依次插入已排序区间的正确位置

    • 时间复杂度:O(n**2)
    • 空间复杂度: O(1)
    • 是否稳定: 稳定. 对于值一样的元素, 后出现的在后面
    # coding:utf-8
    
    def insert_sort(nums):
        length = len(nums)
        for i in range(1, length):
            key = nums[i]
            j = i - 1
            while j >= 0:
                if nums[j] > key:
                    nums[j + 1] = nums[j]
                else:
                    break
                j -= 1
            nums[j + 1] = key
    
        print(nums)
    
    
    if __name__ == "__main__":
        nums = [4, 5, 2, 6, 1, 8]
        insert_sort(nums)
    
    

    3.选择排序

    和插入排序类似, 都会区分已排序区间和待排序区间, 区别是选择排序每次会拿出待排序区间中最小的元素追加到已排序区间

    • 空间复杂度: O(1)
    • 时间复杂度:O(n**2)
    • 是否稳定: 不稳定. 对于相等的元素会出现 后出现的排序完成后出现在前面
    # coding:utf-8
    
    def select_sort(nums):
        length = len(nums)
        for i in range(length):
            min_num = float("inf")
            for j in range(i, length):
                if nums[j] < min_num:
                    min_num = nums[j]
                    min_position = j
            nums[i], nums[min_position] = nums[min_position], nums[i]
    
        print(nums)
    
    
    if __name__ == "__main__":
        nums = [4, 5, 2, 6, 1, 8]
        select_sort(nums)
    
    

    后面我会再整理出其它常用的排序算法, 欢迎大家继续关注

  • 相关阅读:
    Elasticsearch 搭建
    P137、面试题23:从上往下打印二叉树
    数组高级应用—排序与查找
    Java API ——StringBuffer类
    Java API ——String类
    P134、面试题22:栈的压入、弹出序列
    P132、面试题21:包含min函数的栈
    P127、面试题20:顺时针打印矩阵
    P125、面试题19:二叉树的镜像
    Java API ——Scanner类
  • 原文地址:https://www.cnblogs.com/zlone/p/11154854.html
Copyright © 2011-2022 走看看