美文网首页
python-036-插入排序

python-036-插入排序

作者: DKider | 来源:发表于2019-05-04 16:35 被阅读0次

友好简单的排序算法——插入排序。直接看程序或者看定义之类直接讲解的文字,我觉得还是不太好理解。
其实插入排序更适合一部分已经有序的序列,比如1,2,3,4,5,6,9,8,7。

我们应该都摸过扑克牌吧,或者搓过麻将吧。我说的是实体的牌,不是换了斗地主还有麻将。
我们来回忆一下,当我们拿到一张新牌,我们在干什么?当我们拿到一堆没有序的牌我们在干什么?

我们在给牌排序,无论是从A,2,3,……,K,还是从2,A,K,Q,……3。我们总是从一张牌开始,然后拿到一张新的,放到它应该在的位置,直到我们全部排好我们的牌。

打麻将时,摸到一张新的牌,但是又不需要打出去时,我们也会把它放到它应该在的位置,我们在开始打麻将时就会把牌排好,直接插就行。

如果你没打过麻将,没有打过扑克,……,我也不知道怎么办了。

插入排序的原理和我们打扑克搓麻将是一样的。上面的两个例子,刚好就说明了我们的过程。两种,一是给一堆没有顺序的序列排序,二是给一个新的元素插入到一个有序的序列中。

我们把第一个元素看作一个有序的序列,后面的看作无序的待插入的序列。从第二个数开始,将其与其前一个数比较,如果不符合我们要求的排序顺序(升序或者降序,或者我们自己定义的规则),则互换位置,然后再与前一个数作比较直到满足我们的排序顺序。然后再将下一个数进行排序,直到全部完成。
例如 5, 3, 2, 6 的排序过程:

  • 5, 3, 2, 6
  • 3, 5, 2, 6
  • 3, 5, 2, 6
  • 3, 2, 5, 6
  • 2, 3, 5, 6
  • 2, 3, 5, 6
  • 2, 3, 5, 6

这样就很好理解,但是还不够好。后面再来优化,我们先来实现这个insertion_sort():

def insertion_sort(a):
    for i in range(1,len(a)):   # 插入排序从第二个位置开始
        for j in range(i, 0, -1):
            if a[j] < a[j-1]:
                a[j], a[j-1] = a[j-1], a[j]


a = [9, 7, 5, 6, 3, 2, 1, 4, 8]
insertion_sort(a)
print(a)

输出结果为:

image.png

这样一个简单的插入排序算法就实现出来了。

前面说的可以优化是这样,每一次排序时,我们都需要将当前值与其前面的数互换位置m次,m是比较后不满足要求的次数。所以如果第k个数需要排在第一位,那么他就需要互换位置k-1次。互换位置在python中直接用一个语句就可以完成,但是在其他的语言中就需要用一个临时值来做过渡,才能够完成,所以我们应该减少互换位置的次数。

我在前面的扑克牌的举例中,已经加粗了相关的部分,就是应该在的位置。我们先存储当前排序的数,然后找到它应该在的位置,然后将这个位置空出来,并把记录的值放到这个位置。也就是把这个位置之后的元素,都后移一个位置,然后插入,这真的是非常形象了。

下面我们来实现这个排序算法:

def new_insertion_sort(a):
    for i in range(1, len(a)):  # 插入排序从第二个位置开始
        cur = a[i]  # 保存当前的值
        j = i   # 用于寻找cur应该在的位置
        while j > 0:
            if a[j-1] > cur:
                a[j] = a[j-1]
                j -= 1
            else:
                break
        a[j] = cur

当然我们还可以改进:

def new_insertion_sort(a):
    for i in range(1, len(a)):  # 插入排序从第二个位置开始
        cur = a[i]  # 保存当前的值
        j = i   # 用于寻找cur应该在的位置
        while j > 0 and a[j-1] > cur:
            a[j] = a[j-1]
            j -= 1
        a[j] = cur

最后的结果是一样的:


image.png

相关文章

  • python-036-插入排序

    友好简单的排序算法——插入排序。直接看程序或者看定义之类直接讲解的文字,我觉得还是不太好理解。其实插入排序更适合一...

  • 算法-插入排序

    算 法:插入排序算法时间复杂度: 插入排序算法描述 插入排序伪代码 插入排序实现 插入排序算法概述 插入排...

  • java快速学习排序---插入排序

    1.java实现插入排序 (1)、图解插入排序 (2)、插入排序的思想 (3)、插入排序的代码实现

  • c算法O(n)^2(一)

    选择排序 插入排序 优化插入排序算法

  • 一遍文章搞定插入排序-java版

    插入排序 1.1 插入排序的基本介绍 插入排序属于内排,就是以插入的方式来达到排序的目的 1.2 插入排序思想 将...

  • leetcode的题目147

    147. 对链表进行插入排序 对链表进行插入排序。 插入排序算法: 插入排序是迭代的,每次只移动一个元素,直到所有...

  • 算法(排序)

    一、内部排序 1、插入排序—直接插入排序(Straight Insertion Sort) 2、插入排序—希尔排序...

  • 力扣(LeetCode) -147 对链表进行插入排序

    本题考察的插入排序和链表操作 题目描述 对链表进行插入排序。 插入排序算法:插入排序是迭代的,每次只移动一个元素,...

  • 插入排序

    一、直接插入排序 二、折半插入排序

  • 几种实用的简易的排序算法

    也是面试题 一、插入排序 1.插入排序—直接插入排序(Straight Insertion Sort) 思路 遍历...

网友评论

      本文标题:python-036-插入排序

      本文链接:https://www.haomeiwen.com/subject/pqbnnqtx.html