八大排序算法之插入排序

算法思想:每一趟将一个待排序的记录,按照其关键字的大小插入到有序队列的合适位置里,知道全部插入完成。

设计步骤

  假设有一组无序序列 R0, R1, ... , RN-1。

  (1) 我们先将这个序列中下标为 0 的元素视为元素个数为 1 的有序序列。

  (2) 然后,我们要依次把 R1, R2, ... , RN-1 插入到这个有序序列中。所以,我们需要一个外部循环,从下标 1 扫描到 N-1 。

  (3) 接下来描述插入过程。假设这是要将 Ri 插入到前面有序的序列中。由前面所述,我们可知,插入Ri时,前 i-1 个数肯定已经是有序了。

  所以我们需要将Ri 和R0 ~ Ri-1 进行比较,确定要插入的合适位置。这就需要一个内部循环,我们一般是从后往前比较,即从下标 i-1 开始向 0 进行扫描。

代码实现

def get_number(num):
    import random
    lst = []
    i = 0
    while i < num:
        lst.append(random.randint(0,100))
        i += 1
    return lst

def insertsort(lst):
    if lst:
        if len(lst) == 1:
            return lst
        else:
            for i in range(1,len(lst)):
                tmp = lst[i]
                for j in range(i):
                    if lst[j] > lst[i]:
                        for k in range(i,j,-1):
                            lst[k] = lst[k-1]
                        lst[j] = tmp
            return lst
    return None
a = get_number(10)
print("排序之前:",a)
b = insertsort(a)
print("排序之后:",b)

#######输出结果##########
排序之前: [53, 20, 64, 11, 72, 89, 34, 60, 36, 25]
排序之后: [11, 20, 25, 34, 36, 53, 60, 64, 72, 89]

性能分析

时间复杂度

  当数据正序时,执行效率最好,每次插入都不用移动前面的元素,时间复杂度为O(N)

  当数据反序时,执行效率最差,每次插入都要前面的元素后移,时间复杂度为O(N2)

  所以,数据越接近正序,直接插入排序的算法性能越好

空间复杂度由直接插入排序算法可知,我们在排序过程中,需要一个临时变量存储要插入的值,所以空间复杂度为 1 。

算法稳定性直接插入排序的过程中,不需要改变相等数值元素的位置,所以它是稳定的算法。

时间: 2024-10-12 12:40:51

八大排序算法之插入排序的相关文章

八大排序算法之一插入排序

基本思想: 将一个记录插入到已排序好的有序表中,从而得到一个新,记录数增1的有序表.即:先将序列的第1个记录看成是一个有序的子序列,然后从第2个记录逐个进行插入,直至整个序列有序为止. 要点:设立哨兵,作为临时存储和判断数组边界之用. 如果碰见一个和插入元素相等的,那么插入元素把想插入的元素放在相等元素的后面.所以,相等元素的前后顺序没有改变,从原无序序列出去的顺序就是排好序后的顺序,所以插入排序是稳定的. 效率:时间复杂度:O(n2),空间复杂度为 O(1). 下面此题是HDU-1040题:(

八大排序算法学习笔记:插入排序(一)

插入排序     包括:直接插入排序,二分插入排序(又称折半插入排序),链表插入排序,希尔排序(又称缩小增量排序).属于稳定排序的一种(通俗地讲,就是两个相等的数不会交换位置) . 直接插入排序: 1.算法的伪代码(这样便于理解):     INSERTION-SORT (A, n)             A[1 . . n] for j ←2 to n do key ← A[ j] i ← j – 1 while i > 0 and A[i] > key do A[i+1] ← A[i]

八大排序算法学习笔记:插入排序(二分插入排序)

二分插入排序   也称折半插入排序, 1.基本思想:设数列[0....n]分为两部分一部分是[0...i]为有序序列,另一部分是[i+1.....n]为无序序列,从无序序列中取一个数 x ,利用二分查找算法找到 x 在有序序列中的插入位置并插入,有序序列还是有序的,接下来重复上述步骤,直到无序序列全部插入有序序列 ,这是整个序列只剩下有序序列即有序了. 2.代码:    3.复杂度: 用二分插入排序所要进行的总比较次数为O(lgn),当n较大时,比直接插入排序的最大比较次数小得多,但大于最小比较

谈谈八大排序算法问题

排序算法可以说是算法的入门以及算法学习阶段的基石,排序算法显得那么的基础又是非常重要的一种算法.排序算法常常作为一些高阶算法的数据处理中间过程在实际的问题处理中被应用的最为广泛,因此算法选将阶段就从八大排序算法开始.在本节内容中既可以看到一般性的比如插入排序,冒泡排序等基础算法又可以看到比如基数排序,位图排序,快速排序等等比较难理解的算法,算法之门从排序算法说起. 1.插入排序 插入排序算法的原理很简单,默认A中有一部分数据已经排好序了,后续只要从没有排好序的序列里面每拿出一个数字就在排好序的序

八大排序算法源码 + 耗时长度比较(看到好东西转下)

八大排序算法的排序时间长度的比较,测试数据10000000时部分结果如下 输入测试数据长度: 10000000数据初始化中...数据初始化完成!        堆排序用时:    8秒 499毫秒      快速排序用时:   22秒  35毫秒      归并排序用时:   34秒 473毫秒 另外五种排序本人并未等待结果,读者可自行测试 测试时请注意内存消耗,以免数据太大,内存不够,可自行测试单一算法以便增加可测试数据数目 #include <iostream> #include <

数据结构与算法之——八大排序算法

附:关于这个主题,网上好的文章已经数不胜数,本篇是整合后的文章. 正文: 一.概述 排序算法可以分为内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存. 本文所指八大排序就是内部排序. 当n较大,则应采用时间复杂度为O(nlog2n)的排序方法:快速排序.堆排序或归并排序序. 快速排序:是目前基于比较的内部排序中被认为是最好的方法,当待排序的关键字是随机分布时,快速排序的平均时间最短: 二.排序算法详述 1.

[Data Structure] 八大排序算法

排序有内部排序和外部排序之分,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存.我们这里说的八大排序算法均为内部排序. 下图为排序算法体系结构图: 1. 直接插入排序(Straight Insertion Sort ) 基本思想:将待排序的无序数列看成是一个仅含有一个元素的有序数列和一个无序数列,将无序数列中的元素逐次插入到有序数列中,从而获得最终的有序数列. 算法流程: 1)初始时, a[0]自成一个有序区, 无序区为a[1

(转)详解八大排序算法

概述 排序有内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存. 我们这里说说八大排序就是内部排序. 当n较大,则应采用时间复杂度为O(nlog2n)的排序方法:快速排序.堆排序或归并排序序. 快速排序:是目前基于比较的内部排序中被认为是最好的方法,当待排序的关键字是随机分布时,快速排序的平均时间最短: 1.插入排序—直接插入排序(Straight Insertion Sort) 基本思想: 将一个记录插入到

排序算法(九)——八大排序算法总结

八大排序算法的稳定性及复杂度总结如下: 选择排序算法准则 每种排序算法都各有优缺点.因此,在实用时需根据不同情况适当选用,甚至可以将多种方法结合起来使用. 影响排序的因素有很多,平均时间复杂度低的算法并不一定就是最优的.相反,有时平均时间复杂度高的算法可能更适合某些特殊情况.同时,选择算法时还得考虑它的可读性,以利于软件的维护.一般而言,需要考虑的因素有以下四点: 1.待排序的记录数目n的大小: 2.记录本身数据量的大小,也就是记录中除关键字外的其他信息量的大小: 3.关键字的结构及其分布情况: