vlambda博客
学习文章列表

我的小白女友都能看懂的超简单直接插入排序算法!


有个很简单但是也很有趣的小问题,给你一个数列,提个要求,把这个数列里面所有的元素按照从小到大的顺序排列。对于人来说,排列数字直接把数字随便拖动就可以了。但是,看似简单的操作在计算机内部却并不简单。

今天,我们简单介绍几种排序非常实用的算法。首先使用python自带的random库生成一组随机数。代码如下:

import random as r
def listcreate():
    '''
    创建随机数组成的列表
    '''
    list_random=[]
    for i in range(5):
        list_random.append(r.randint(0,100))#生成随机数并插入列表
    print(list_random)
    return list_random
if __name__ == '__main__':
    listcreate()

 

只要调用listcreate()函数就可以构造出一个含有五个随机数的列表。我们来运行一下代码,运行结果如图所示。

 


想要排序这个数列,在python中就提供了非常高效的方法。我们来看一下sort()方法的语法:

list.sort( key=None, reverse=False)

sort()方法中的key,reverse都是可选参数。参数key可以给定可迭代对象的某一个元素,sort()方法会按照可迭代对象中的给定元素来进行排序。参数reverse的默认值是False,如果不给定该参数,则默认按照升序排序。若将reverse指定为True,则按照降序排列。

下面是几个例子:

不给定可选参数的情况,默认按照升序进行排列。

List_1=[9,8,6,8,9,3,7]
List_1.sort()
print('默认排序结果',List_1)

 

运行结果如图:

 

我的小白女友都能看懂的超简单直接插入排序算法!


我们使用一个由元组组成的列表来按照每个元组的第二个元素进行排序。

List_2=[(1,1,2),(8,2,6),(11,3,9),(4,4,2)]
def get2(item):
    return item[1]#item为函数参数,表示列表中的每个元组,返回每个元组的第二个元素
if __name__ == '__main__':
    get2(List_2)
    List_2.sort(key=get2)
    print('按照每个元组的第二个元素排列结果',List_2 )

 

运行结果如图:

 

我的小白女友都能看懂的超简单直接插入排序算法!


将列表按照降序排列。

List_1=[9,8,6,8,9,3,7]
List_1.sort(reverse=True)
print('降序排列结果',List_1)

 

运行结果如图:

 

我的小白女友都能看懂的超简单直接插入排序算法!


以上对python中的list.sort()的介绍就这么多。下面我们介绍一下冒泡排序和直接插入排序的基本算法思想。这两种算法思想是比较朴素的算法,在排序中应用也比较广泛。当然后来也发展出了堆排序,块排序,快速排序,甚至是直接开辟出单独的存储单元的希尔排序。这里就不再一一赘述。

首先我们来介绍一下最简单的直接插入排序算法。我们把计算机内部的存储空间实体化为桌面。将需要排序的数据实体化为一个书架上放着的若干本书,书架我们称作书架A,需要将这些书按照颜色进行排序。我们可以在桌面上再放上一个空的书架,我们这里直接称作书架B。从书架A直接取出第一本书放到书架B上,再取出第二本书与书架B上的第一本书进行颜色的比较,如果第二本书的颜色在书架B上的第一本书之前,就放在第一本书之前。反之,则放在第一本书之后。进行这次操作之后,可以保证书架B上的第一本书和第二本书是有序的。以此类推,进行书架A上的第三本书的操作,书架A上的第三本书与书架B上的第二本书进行比较,如果颜色在书架B上的第二本书之后,就把书架A上的书放在书架B的第二本书之后。如果颜色在书架B上的第二本书之前,就与书架B上的第一本进行比较。这样就获得了书架B上的三本有序的书。按照这样将书架A上的所有书移动到书架B上,书架B上的书就是经过排序的有序的书籍,直接返回书架B,就是排序结果。

python语言来实现直接插入排序的代码如下:

def insert_sort():
    '''
    使用直接插入排序进行排序
    '''
    import random as r
    list_random=[]
    for i in range(5):
        list_random.append(r.randint(0,100))#生成0和100之间的随机数
    print('未排序的列表是:',list_random)#打印未排序的列表
    list_insertsort=[list_random[0]]#将未排序的列表第一个元素插入新列表
    for i in range(1,len(list_random)):
        flag=False
        j=len(list_insertsort)-1
        while(j>=0):
            if (list_random[i] >= list_insertsort[j]):
                list_insertsort.insert(j + 1, list_random[i])
                flag = True#只要满足这个数不是新列表中的最小数,完成插入后改变标记值直接退出循环
                break
            else:
                pass
            j=j-1#改变判断的下标控制循环
        if(flag==True):
            continue#已经完成插入,直接跳过后面语句进入下一次循环
        else:
            list_insertsort.insert(0,list_random[i])#在循环结束后标记仍为Flase,标识该数是新数列中最小值,直接插入在下标为0处
    print('直接插入排序后的列表是:',list_insertsort)
if __name__ == '__main__':
    insert_sort()#调用方法

 

运行结果如图:

 

以上就是本期直接插入排序的主要内容,下期我们继续介绍冒泡排序算法的原理以及具体实现的代码哦。关注不迷路~rua