• 【算法】插入排序


      插入排序的大体思路就是一开始会将未排序的数据分为两部分,一部分是已排序的数组,另一部分是未排序的数组。然后将未排序数组中的第一个元素挑出来,和前面已排序的数组进行比较,插入合适的位置。依此进行,直到未排序数组为空。

      例如:待排序的数组为[4, 5,6,1,3,2], 一开始  一排序的数组为[ 4 ], 未排序的数组未 [ 5, 6, 1, 3, 2]。然后从元素5开始选择在排序数组中的插入位置, 完毕之后,排序数组变为[4,5], 未排序的数组变为[ 6, 1, 3, 2]。然后继续执行之前的操作。

      

      实现代码:

     1 def insert_sort(arry):
     2     if len(arry) < 2:           # 当数组中元素小于2 时直接返回。
     3         return arry
     4 
     5     for i in range(1, len(arry)):    # 从未排序数组中第一个开始。
     6         index = arry[i]              #记录第一个元素的值
     7         j = i-1
     8         while j >= 0:           
     9             if arry[j] > index:      # 如果排序数组中第j和元素大于该元素, 则将其向后移动一位。
    10                 arry[j+1] = arry[j]
    11             j -= 1
    12         arry[j+1] = index            # 将index的值复制到相应的位置。

      分析:

      稳定性分析: 当在排序过程中,只有当排序数组中元素大于当前未排序数组中元素时,才会向后移动,这保证了如果两个相等的元素进行比较,这不会导致元素向后移动,会直接在当前位置进行插入。这意味者插入排序是稳定算法。并且为原地排序。

      时间复杂度和空间复杂度分析:插入排序在最好的情况下时间复杂度为O(n)(已经是有序的), 而最坏的情况下为O(n2)。 但是大部分情况下,都不会直接有序。而平均时间复杂度为O(n(n+1)/4)省去系数为O(n2)。空间复杂度为O(1)。

  • 相关阅读:
    SQL语句中exists/not exists的用法分析
    码元、符号、波特率、比特率等概念的了解
    LED学习及一个花样流水灯的实现
    数学建模总结
    单片机控制继电器
    透明传输
    DNN4.8+SQL 2005 EXPRESS安装及DNN 4.8版本的新特性与其他版本的差异
    为什么我被google 迷住了!还很激动!Google是什么?它为何有趣
    四角号码查询器 第3版 发布
    google base不只是ebay!令人激动的google base
  • 原文地址:https://www.cnblogs.com/GoodRnne/p/10598865.html
Copyright © 2020-2023  润新知