zoukankan      html  css  js  c++  java
  • 直接插入排序--循环实现

     1 # 版本1 自己写的 ,效率有点低
     2 
     3 %%timeit # 2.92 µs ± 62.8 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
     4 lst = [1,5,7,6]
     5 newlst = [0] + lst # [0,1,9,8,5,6]
     6 
     7 
     8 for i in range(2, len(newlst)):# 2,   3,   4, 5
     9     newlst[0] = newlst[i] # 9,   8,   5, 6
    10     for j in range(i-1,0,-1):# 1,   2 ,1,    3,2,1,  4,3,2,1
    11         if newlst[0] < newlst[j]:# 
    12             newlst[j+1] = newlst[j]
    13         if newlst[0] > newlst[j]:
    14             newlst[j+1] = newlst[0]
    15             break
    16 #     print(newlst)
     1 # 第二版本
     2 
     3 %%timeit # 1.48 µs ± 23.3 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
     4 lst = [1,5,7,6]
     5 newlst = [0] + lst # [0,1,9,8,5,6]
     6 
     7 for i in range(2, len(newlst)):
     8     newlst[0] = newlst[i]
     9     
    10     j = i - 1
    11     if newlst[j] > newlst[0]:
    12         while newlst[j] > newlst[0]:
    13             newlst[j+1] = newlst[j]
    14             j -= 1
    15         newlst[j + 1] = newlst[0]
    16 # print(newlst)
    17         
    18         
    19         
    20         

    直接插入排序:

      直接插入排序原理:

        在未排序的序列中,构建一个子排序序列,直至全部数据排序完成

        将待排序的数,插入到已经派苏的序列中合适的位置

        增加一个哨兵位置,用来放入待比较值,让他和后面已经排好序的序列比较,找到合适的插入点

     1 lst = [1,4,9,8,6]
     2 
     3 
     4 '''
     5     [5,3,1,2]--[3,5,1,2] --[1,3,5,2] -- [1,2,3,5]
     6 '''
     7 length = len(lst) # 4
     8 
     9 for i in range(1, length): # [1,3] 1,2
    10     min = lst[:i] # [5] ,[3,5]
    11     for j in range(len(min)): # 0    0,1
    12         if lst[i -j] < min[len(min) -1 -j]: # 3 <5    1<5
    13             lst[i-j], lst[len(min) -1-j] = lst[len(min)-1-j],lst[i-j] #
    14             # print('--')
    15 print(lst)
    利用切片实现的排序,参考插入排序

        直接插入排序:

          最好情况,正好是升序排列,比较迭代 n-1 次

          最差的情况,正好是降序排列,比较迭代1,2,3,4,...,n-1即n(n-1)/2

          使用两层嵌套循环,时间复杂度O(n^2)

          稳定排序算法:

            如:3,2,2,1 排序后,1,2,2,3 中间的2,2 前后顺序是不变的,所以称为稳定排序

          使用在小规模数据比较

          可优化点:

              如果比较操作耗时大的话,可以采用二分查找来提高效率,即二分查找插入排序。最最要的是每次找到数据要插入的位置后,后面的数字要往后挪,是需要很大的时间的。

    为什么要坚持,想一想当初!
  • 相关阅读:
    Linux下设置svn开机自启动
    LNMP 如何安装mongodb ----lnmp一键安装包之后
    MySQL表类型MyISAM/InnoDB的区别(解决事务不回滚的问题)
    PHP处理MySQL事务代码
    php redis 秒杀demo
    PHP5.6版本安装redis扩展
    Jzoj5662 尺树寸泓
    Jzoj3351 神牛养成计划2
    Jzoj5622 table
    Jzoj5608 Subset
  • 原文地址:https://www.cnblogs.com/JerryZao/p/9519727.html
Copyright © 2011-2022 走看看