zoukankan      html  css  js  c++  java
  • 数据结构和算法-排序算法-插入排序

     ##################    插入排序        ####################

    """
    
    插入算法:
    alist = [54,26,93,17,77,31,44,55,20]
    还是把序列分为两部分,
    一开始就把第一个数字认为是有序的,                               alist = [54,       26,93,17,77,31,44,55,20]
    第一轮, 把第二部分的和第一部分的最后一个做比较,如果小就交换,   alist = [26,54       93,17,77,31,44,55,20]
    第二轮,把第二部分的第一个和第一部分的最后一个作比较,小就交换,然后再往前比较,如果小还需要交换,
    所以总的实现就是把后面的第一个,一直和前面的从后往前比较,知道结束,
    
    选择排序和插入排序比较:
    插入排序是从第二部分取出第一个,然后和第一部分从头到尾去比较,然后插入进去,
    和选择排序不一样,选择排序也是分为两部分,但是是比较后面的,比较出来最小的然后插入到第一部分的最后面去,这是选择排序,
    
    """

    ##################    插入排序        ####################

    # 第一版:
    def insert_sort(alist):
        n=len(alist)
        for j in range(1,n):
            i = j
            while i>0:
                if alist[i] < alist[i-1]:
                    alist[i],alist[i-1]= alist[i-1],alist[i]
                    i -=1
                else:
                    break  # 不加这一句也可以,但是可以优化最优的时间复杂度,对于有序的队列,内层的复杂度就变成1了,
    
    
    # 第二版:
    def insert_sort2(alist):
        # 从第二个位置,即下标为1的元素开始向前插入
        for i in range(1, len(alist)):
            # 从第i个元素开始向前比较,如果小于前一个元素,交换位置
            for j in range(i, 0, -1):
                if alist[j] < alist[j-1]:
                    alist[j], alist[j-1] = alist[j-1], alist[j]
    
    # 外层循环是确保把第二部分的所有元素都取出来
    # 内层循环是确保把取出来的值从后往前比较一遍,如果小就交换,
    
    
    if __name__ == '__main__':
    
        alist = [54,26,93,17,77,31,44,55,20]
        print(alist)
        insert_sort(alist)
        print(alist)
  • 相关阅读:
    sql函数 StringSplit(SELECT * from Split('黄色,蓝色,黑色',','))
    跨表循环写插入sql语句
    将ExCel导入数据库
    行转列
    js正则匹配
    ASP.NET下载远程图片保存到本地的方法、保存抓取远程图片
    C# 解析json类型字符串
    上传图片
    存储过程学习
    //js验证数字输入,以及保留俩位
  • 原文地址:https://www.cnblogs.com/andy0816/p/12348380.html
Copyright © 2011-2022 走看看