浅谈插入排序算法在Python程序中的实现及简单改进


Posted in Python onMay 04, 2016

Python实现插入排序的一般范例为:

#coding=cp936
#coding=cp936
#插入排序算法
def InsertionSort(A):
  for j in range(1,len(A)):
    key = A[j]
    i = j-1
    #向前查找插入位置
    while i>=0 and A[i]>key:
      A[i+1] = A[i]
      i = i-1
    A[i+1] = key
 
#初始化输入数据
A = []
input = raw_input('please input some numbers:') #输入逗号分隔整数列 如:7,6,5,1,8,34
for item in input.split(','):
  A.append(int(item))
 
InsertionSort(A)#插入排序
print A

插入算法的原理是:当前元素和已经排序好的部分比较,满足条件时插入,插入点之后的元素全部往后移。
然而,我也正是受这个描述的误导,在实现的时候走了一些弯路。比如有以下列表:

test = [2, 5, 11, 21, 10, 18, 24]

比如当前元素是10,我在开最初的实现思路是从列表的第一个元素开始,一直比较到元素11才找到合适位置.这样做最终是可以实现排序的,但是有一个问题,就是当我把10插入11的位置之后,11和21都需要往后移,这又需要另一个循环,实现如下:

def insertSort(sort_list):
  list_length = len(sort_list)
  if list_length < 2 :
    return sort_list
  for i in range(1,list_length):
    key = sort_list[i]
    j = 0
    while j < i:
      if sort_list[j] > key:
        for k in range(i,j,-1):
          sort_list[k] = sort_list[k-1]
        sort_list[j] = key
        break
      j += 1
  return sort_list

   首先,引入了三个循环变量以及三层循环,效率较低;其次是代码结构会比较混乱,需要改进。

后来我想能不能比较完一个元素就把它移到合适的位置,好如去超市买水果,手里拿到不合适的,总会直接把它放到一边,不会再碰它。具体到算法实现,还用上面的列表举例,当前元素是10,先跟相邻的21比较,发现21比10大,则21往后移动一位,即移到10所在位置;然后10和11比较,又会把11往后移动一位;在比较到元素5时,发现已经找到了10应该存放的位置,而此时移动也随之完成。
代码实现如下:

def insertSort(sort_list):
  list_length = len(sort_list)
  if list_length < 2 :
    return sort_list
  for i in range(1,list_length):
    key = sort_list[i]
    j = i - 1
    while j >=0 and sort_list[j] > key:
      sort_list[j+1] = sort_list[j]
      j -= 1
    sort_list[j+1] = key
  return sort_list

   孰优孰劣,大家对比便知。

Python 相关文章推荐
在Python的Django框架的视图中使用Session的方法
Jul 23 Python
python网络编程调用recv函数完整接收数据的三种方法
Mar 31 Python
Python数据分析之如何利用pandas查询数据示例代码
Sep 01 Python
详解Python3的TFTP文件传输
Jun 26 Python
详解windows python3.7安装numpy问题的解决方法
Aug 13 Python
Python实现压缩文件夹与解压缩zip文件的方法
Sep 01 Python
pygame游戏之旅 按钮上添加文字的方法
Nov 21 Python
Keras 利用sklearn的ROC-AUC建立评价函数详解
Jun 15 Python
Python3实现英文字母转换哥特式字体实例代码
Sep 01 Python
Python实现树莓派摄像头持续录像并传送到主机的步骤
Nov 30 Python
Python从MySQL数据库中面抽取试题,生成试卷
Jan 14 Python
一篇文章带你搞懂Python类的相关知识
May 20 Python
Python中使用插入排序算法的简单分析与代码示例
May 04 #Python
Python中函数参数设置及使用的学习笔记
May 03 #Python
解析Mac OS下部署Pyhton的Django框架项目的过程
May 03 #Python
Python使用urllib2模块抓取HTML页面资源的实例分享
May 03 #Python
Python中字符串的格式化方法小结
May 03 #Python
Python实现约瑟夫环问题的方法
May 03 #Python
Python实现堆排序的方法详解
May 03 #Python
You might like
jquery获取多个checkbox的值异步提交给php的方法
2015/06/24 PHP
最准确的php截取字符串长度函数
2015/10/29 PHP
php HTML无刷新提交表单
2016/04/05 PHP
Array对象方法参考
2006/10/03 Javascript
Extjs4.0设置Ext.data.Store传参的请求方式(默认为GET)
2013/04/02 Javascript
window.location.hash知识汇总
2015/11/09 Javascript
javascript实现uploadify上传格式以及个数限制
2015/11/23 Javascript
JavaScript对象封装的简单实现方法(3种方法)
2017/01/03 Javascript
javascript与PHP动态往类中添加方法对比
2018/03/21 Javascript
详解Vue打包优化之code spliting
2018/04/09 Javascript
Vue实现根据hash高亮选项卡
2019/05/27 Javascript
vue 接口请求地址前缀本地开发和线上开发设置方式
2020/08/13 Javascript
NestJs使用Mongoose对MongoDB操作的方法
2021/02/22 Javascript
使用Python的Tornado框架实现一个简单的WebQQ机器人
2015/04/24 Python
Python中工作日类库Busines Holiday的介绍与使用
2017/07/06 Python
django创建自定义模板处理器的实例详解
2017/08/14 Python
python进阶_浅谈面向对象进阶
2017/08/17 Python
Python搜索引擎实现原理和方法
2017/11/27 Python
使用python实现knn算法
2017/12/20 Python
解决Pyinstaller 打包exe文件 取消dos窗口(黑框框)的问题
2019/06/21 Python
keras绘制acc和loss曲线图实例
2020/06/15 Python
Django Form常用功能及代码示例
2020/10/13 Python
Python获取android设备cpu和内存占用情况
2020/11/15 Python
Python虚拟环境virtualenv创建及使用过程图解
2020/12/08 Python
国际领先的在线时尚服装和配饰店:DressLily
2019/03/03 全球购物
英国名牌男装店:Standout
2021/02/17 全球购物
意大利和国际奢侈品牌购物网站:Suitnegozi.com
2021/01/15 全球购物
客户表扬信范文
2014/01/10 职场文书
医院工作检讨书范文
2014/02/10 职场文书
荷叶母亲教学反思
2014/04/30 职场文书
小学绿色学校申报材料
2014/08/23 职场文书
弄虚作假心得体会
2014/09/10 职场文书
2014年校长工作总结
2014/12/11 职场文书
竞选稿之小学班干部
2019/10/31 职场文书
OpenCV-Python实现轮廓拟合
2021/06/08 Python
灵能百分百第三季什么时候来?
2022/03/15 日漫