排序算法专题之插入排序

Posted Python算法之旅

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了排序算法专题之插入排序相关的知识,希望对你有一定的参考价值。

说在前面

插入排序的外层循环变量i指向当前待排序元素,也可以看做待排序区域的左边界,每趟排序的结果就是把a[i]插入到合适位置;内层循环变量j从已排序区域的右端向左扫描,比较和移动元素,直到找到插入位置。

   插入排序的特征是虽然已排序区域逐渐增大,但内层循环变量j不一定要扫描整个区域,我们可以使用对分查找快速定位插入位置。

   此外,当整个序列“基本有序”时,a[i]距离它的插入位置通常不太远,往往能够较快地完成插入操作,这也是“希尔排序算法”之所以效率较高的原因。


“Python算法之旅”微信群等着你
排序算法专题之插入排序
排序算法专题之插入排序
排序算法专题之插入排序
排序算法专题之插入排序

扫码加入“Python算法之旅”微信群,和斌哥面对面交流,更多资料和更有趣的话题等你一起来分享。

排序算法专题之插入排序

插入排序算法(填空版)

1.  经典插入排序

例题1.使用插入排序算法对列表a升序排序。

函数名:insert_sort(a)

参数表:a -- 待排序列表。

返回值:该方法没有返回值,但是会对列表的对象进行升序排序。

算法思想:外层循环控制待排序数组的左边界,即a[i:]为待排序部分;内层循环扫描a[:i],将元素a[i]插入到适当位置

def insert_sort (a):

    for i in range(1, len(a)):

        t, j =  ①                   

        while j >= 0 and a[j] > t:

            a[j+1] = a[j]

            j -= 1

        ②                           


2.  线性查找插入排序

例题2.使用线性查找插入排序算法对列表a升序排序。

函数名:insert_sort_2 (a)

参数表:a -- 待排序列表。

返回值:该方法没有返回值,但是会对列表的对象进行升序排序。

算法思想:外层循环控制待排序数组的左边界,即a[i:]为待排序部分;内层循环扫描a[:i],将元素a[i]插入到适当位置

def insert_sort_2(a):

    #嵌套定义函数,线性查找第一个大于key的元素位置

    def linear_search(key, left, right):

        if a[left] > key:

            return ①            

        else:

            while a[right] > t:

                right -= 1

            return ②             

       

    for i in range(1, len(a)):

        t = a[i]

        j = linear_search(t, 0, i-1)

        for k in range(i-1, j-1, -1):#j指向插入位置

            a[k+1] = a[k]

        a[j] = t


3.  对分查找插入排序

例题3.使用对分查找插入排序算法对列表a升序排序。

函数名:insert_sort_3 (a)

参数表:a -- 待排序列表。

返回值:该方法没有返回值,但是会对列表的对象进行升序排序。

算法思想:外层循环控制待排序数组的左边界,即a[i:]为待排序部分;内层循环扫描a[:i],将元素a[i]插入到适当位置

def insert_sort_3(a):

    #嵌套定义函数,对分查找第一个大于key的元素位置

    def binary_search(key, left, right):

        while left <= right:

            m = (left + right) // 2

            if a[m] > key:

                right = m - 1

            else:

                left = m + 1

        return ①             


    for i in range(1, len(a)):

        t = a[i]

        j = binary_search(t, 0, i-1)

        for k in range(i-1, j-1, -1):#j指向插入位置

            a[k+1] = a[k]

        a[j] = t

插入排序算法(完整版)

1.  经典插入排序

例题1.使用插入排序算法对列表a升序排序。

函数名:insert_sort(a)

参数表:a -- 待排序列表。

返回值:该方法没有返回值,但是会对列表的对象进行升序排序。

算法思想:外层循环控制待排序数组的左边界,即a[i:]为待排序部分;内层循环扫描a[:i],将元素a[i]插入到适当位置

def insert_sort (a):

    for i in range(1, len(a)):

        t, j = a[i], i - 1

        while j >= 0 and a[j] > t:

            a[j+1] = a[j]

            j -= 1

        a[j+1] = t


2.  线性查找插入排序

例题2.使用线性查找插入排序算法对列表a升序排序。

函数名:insert_sort_2 (a)

参数表:a -- 待排序列表。

返回值:该方法没有返回值,但是会对列表的对象进行升序排序。

算法思想:外层循环控制待排序数组的左边界,即a[i:]为待排序部分;内层循环扫描a[:i],将元素a[i]插入到适当位置

def insert_sort_2(a):

    #嵌套定义函数,线性查找第一个大于key的元素位置

    def linear_search(key, left, right):

        if a[left] > key:

            return left

        else:

            while a[right] > t:

                right -= 1

            return right + 1

       

    for i in range(1, len(a)):

        t = a[i]

        j = linear_search(t, 0, i-1)

        for k in range(i-1, j-1, -1):#j指向插入位置

            a[k+1] = a[k]

        a[j] = t


3.  对分查找插入排序

例题3.使用对分查找插入排序算法对列表a升序排序。

函数名:insert_sort_3 (a)

参数表:a -- 待排序列表。

返回值:该方法没有返回值,但是会对列表的对象进行升序排序。

算法思想:外层循环控制待排序数组的左边界,即a[i:]为待排序部分;内层循环扫描a[:i],将元素a[i]插入到适当位置

def insert_sort_3(a):

    #嵌套定义函数,对分查找第一个大于key的元素位置

    def binary_search(key, left, right):

        while left <= right:

            m = (left + right) // 2

            if a[m] > key:

                right = m - 1

            else:

                left = m + 1

        return left


    for i in range(1, len(a)):

        t = a[i]

        j = binary_search(t, 0, i-1)

        for k in range(i-1, j-1, -1):#j指向插入位置

            a[k+1] = a[k]

        a[j] = t

写在后面

Python排序算法系列文章是我在阅读了大量算法专著以后,尝试用浅陋的语言把自己的理解表达出来。由于本人水平有限,表述中难免出现疏漏甚至错误之处,敬请谅解。

无论是赞同还是反对我的看法,都请你给我留言。如果你有新的想法,千万不要憋在心里,请发出来大家一起讨论。让我们相互学习,共同进步!


需要本文word版的,可以加入“选考VB算法解析”知识星球参与讨论和下载文件,“选考VB算法解析”知识星球汇集了数量众多的同好,更多有趣的话题在这里讨论,更多有用的资料在这里分享。

我们专注选考VB算法,感兴趣就一起来!



相关优秀文章:


以上是关于排序算法专题之插入排序的主要内容,如果未能解决你的问题,请参考以下文章

排序专题之 各个内外排序算法的比较

排序专题-插入排序

排序算法专题之选择排序

排序专题之插入排序

选考VB算法专题系列讲座9插入排序算法

插入排序算法导学案