浅谈插入排序算法在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实现从网络下载文件并获得文件大小及类型的方法
Apr 28 Python
使用Python的内建模块collections的教程
Apr 28 Python
Python实现短网址ShortUrl的Hash运算实例讲解
Aug 10 Python
Python正规则表达式学习指南
Aug 02 Python
python将ansible配置转为json格式实例代码
May 15 Python
Python实现将sqlite数据库导出转成Excel(xls)表的方法
Jul 17 Python
深入理解Python 关于supper 的 用法和原理
Feb 28 Python
关于Python核心框架tornado的异步协程的2种方法详解
Aug 28 Python
scrapy数据存储在mysql数据库的两种方式(同步和异步)
Feb 18 Python
Python 如何实现访问者模式
Jul 28 Python
基于Python编写一个计算器程序,实现简单的加减乘除和取余二元运算
Aug 05 Python
python调用摄像头的示例代码
Sep 28 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
从康盛产品(discuz)提取出来的模板类
2011/06/28 PHP
Zend Framework教程之路由功能Zend_Controller_Router详解
2016/03/07 PHP
php模仿qq空间或朋友圈发布动态、评论动态、回复评论、删除动态或评论的功能(中)
2017/06/11 PHP
Windows上php5.6操作mongodb数据库示例【配置、连接、获取实例】
2019/02/13 PHP
jQuery 使用手册(二)
2009/09/23 Javascript
JavaScript Title、alt提示(Tips)实现源码解读
2010/12/12 Javascript
调用innerHTML之后onclick失效问题的解决方法
2014/01/28 Javascript
快速使用Bootstrap搭建传送带
2016/05/06 Javascript
关于动态生成dom绑定事件失效的原因及解决方法
2016/08/06 Javascript
浅谈js对象属性 通过点(.) 和方括号([]) 的不同之处
2016/10/29 Javascript
基于JS实现移动端左滑删除功能
2017/07/28 Javascript
vue2.0 使用element-ui里的upload组件实现图片预览效果方法
2018/09/04 Javascript
jquery操作select常见方法大全【7种情况】
2019/05/28 jQuery
jQuery-Citys省市区三级菜单联动插件使用详解
2019/07/26 jQuery
使用vue-cli4.0快速搭建一个项目的方法步骤
2019/12/04 Javascript
Python的Django框架中的表单处理示例
2015/07/17 Python
分享一个可以生成各种进制格式IP的小工具实例代码
2017/07/28 Python
简单谈谈python中的lambda表达式
2018/01/19 Python
使用pyinstaller打包PyQt4程序遇到的问题及解决方法
2019/06/24 Python
python接口调用已训练好的caffe模型测试分类方法
2019/08/26 Python
Python流程控制 if else实现解析
2019/09/02 Python
Selenium 配置启动项参数的方法
2020/12/04 Python
估算杭州有多少软件工程师
2015/08/11 面试题
公司营业员的工作总结自我评价
2013/10/05 职场文书
后勤园长自我鉴定
2013/10/17 职场文书
运动会广播稿100字
2014/01/11 职场文书
领导干部群众路线教育实践活动个人对照检查材料
2014/09/23 职场文书
仓库统计员岗位职责
2015/04/14 职场文书
小学学习委员竞选稿
2015/11/20 职场文书
2016年教师节感恩寄语
2015/12/04 职场文书
个人工作失误的保证书怎么写?
2019/06/21 职场文书
会议承办单位欢迎词
2019/07/09 职场文书
使用springboot暴露oracle数据接口的问题
2021/05/07 Oracle
golang 实用库gotable的具体使用
2021/07/01 Golang
关于Nginx中虚拟主机的一些冷门知识小结
2022/03/03 Servers
Java 超详细讲解设计模式之中的抽象工厂模式
2022/03/25 Java/Android