插入排序是一种在原理上十分简单的算法,就跟打扑克牌一样,握在手里的是有序数列,每获得一张新牌,就插入有序数列中合适的位置。
- 算法步骤:
- 1:将数组第一个元素是为有序数列,第二个元素即之后的所有元素为未排序数列
- 2:从头到尾依次扫描未排序序列,将扫描到的每个元素插入有序序列的适当位置(如果待插入的元素与有序序列中的某个元素相等,则将待插入元素插入到相等元素的后面。)
-
举个栗子
原数组:3 38 5 44 15 36
第一轮:3 38 5 44 15 36
第二轮:3 5 38 44 15 36
第三轮:3 5 38 44 15 36
…以此类推 - 代码如下:
def insertSort(nums):
n = len(nums)
for i in range(1, n):
insert_index = i-1
temp = nums[i]
while insert_index>=0 and nums[insert_index] > temp:
nums[insert_index+1] = nums[insert_index]
insert_index -= 1
nums[insert_index+1] = temp
nums = [3,38, 5, 44, 15, 36]
insertSort(nums)
print(nums)
- 算法解析:插入排序同样是每一次迭代确定一个元素的位置,一共需要n-1次迭代,然而插入操作的迭代次数无法把我,最好是0,最坏是k(k为迭代次数),因此该算法对于有序数组的时间复杂度为n-1,即O(n),如果将递增数组排序为递减数组,此时是最坏时间复杂度,为(1+2+3+n-1)=(n-1)*n/2,即O(n2),由于该算法是对原数组进行操作,因此空间复杂度为O(1)。
- 由于该算法对待插入的元素与有序序列中的某个元素相等时,将待插入元素插入到相等元素的后面,因此该算法不会改变相等元素的相对次数,是稳定算法。
- 该算法有一种优化版本,由于该算法是基于一种寻找插入位置的方式进行,因此在这个过程可以使用二分查找,因此该算法的优化算法叫折半插入。