Python实现插入排序

插入排序

插入排序实现的原理是将数组分为已排序和未排序两部分,比如现在有数组[2, 5, 4, 3, 6, 1]。

首先将数组分为两部分
已排序:2
未排序:5, 4, 3, 6, 1

然后从未排序的头部取数据,与已排序的数据依次比较来找到这个数据应该在已排序区间的哪个位置。

代码实现

"""
    插入排序
    Author: xingrui
"""


# 插入排序 - 正序
def insertSortWithAsc(nums: list) -> list:
    length = len(nums)

    for i in range(1, length):
        temp = nums[i]

        j = i - 1
        for j in range(j, -1, -1):
            if temp < nums[j]:
                nums[j + 1] = nums[j]
                j = j - 1
            else:
                break

        nums[j + 1] = temp

    return nums


# 插入排序 - 逆序
def insertSortWithDesc(nums: list) -> list:
    length = len(nums)

    for i in range(1, length):
        temp = nums[i]

        j = i - 1
        for j in range(j, -1, -1):
            if temp > nums[j]:
                nums[j + 1] = nums[j]
                j = j - 1
            else:
                break

        nums[j + 1] = temp

    return nums


if __name__ == "__main__":
    nums = [4, 5, 2, 2, 1, 6]

    insertSortWithAsc(nums)
    print('插入排序,正序排列', nums)

    insertSortWithDesc(nums)
    print('插入排序,逆序排列', nums)

插入排序与冒泡排序比较

插入排序和冒泡排序的最好和最坏时间复杂度都分别是O(n)O(n^2),同时空间复杂度都是O(1)。但是在数据很大的时候,插入排序和冒泡排序还是有很大区别的。

冒泡排序在数据交换的时候,需要一个一个临时值,并且要将相邻的两个元素重新赋值,因为在数据很大的时候,多两次赋值操作可能会造成性能上巨大的不同。

我生成了一个长度一万的随机数组

"""
    数字工具
    Author: xingrui
"""
import numpy as np

# 生成随机数组
def randomArray() -> list:
    return np.random.randint(50, size = 10000)


if __name__ == "__main__":
    print(randomArray())

然后分别用冒泡排序和插入排序对和这个数组进行排序并计算耗时:

"""
    测试
    Author: xingrui
"""

from NumberUtils import randomArray
from BubbleSort import bubbleSortWithAsc
from InsertSort import insertSortWithAsc
import time
import copy


if __name__ == "__main__":
    array = randomArray()
    a, b = copy.deepcopy(array), copy.deepcopy(array)
    print(array)

    start = time.time()
    print('冒泡排序: ', bubbleSortWithAsc(a))
    print('冒泡排序耗时: ', time.time() - start)

    start = time.time()
    print('插入排序: ', insertSortWithAsc(b))
    print('插入排序耗时: ', time.time() - start)

最终的耗时如下:


排序耗时

可以看到,在数据规模很大的情况下,使用插入排序要比冒泡排序耗时更短。当然,这可能和机器有关系,我使用的是win10,内存8g的电脑,unix系统上没有试过,所以这个结论并不严谨。

文章参考

https://visualgo.net/en/sorting
https://www.cnblogs.com/q735613050/p/7253073.html
https://www.jianshu.com/p/a0aa94ef8ab2/
https://www.zhihu.com/question/24613226
https://blog.csdn.net/tiange_xiao/article/details/80808081

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 插入排序,其原理是通过构建一个初始的有序序列,然后从无需序列中抽取元素,插入到有序序列的相对排序位置,就像将一堆编...
    Python之战阅读 3,604评论 0 1
  • 插入排序,其原理是通过构建一个初始的有序序列,然后从无需序列中抽取元素,插入到有序序列的相对排序位置,就像将一堆编...
    Python之战阅读 3,427评论 0 2
  • 插入排序适合于部分有序序列和小规模的数据。其平均时间复杂度为 O(N^2),空间复杂度为 O(1),并且为稳定排序...
    Python高效编程阅读 4,937评论 0 9
  • 最近听了王争老师的数据结构与算法之美,大有获益,特写此博客与大家分享. 排序算法太多了,但大体可以归结于三类,冒泡...
    我是码神阅读 14,263评论 1 11
  • 近两年打卡这种方式越来越频繁的出现在我们的生活、学习中,不管是古典老师的100天改变自己训练营,还是潇洒姐和Moo...
    Yo黄澄澄阅读 1,513评论 0 1

友情链接更多精彩内容