浅谈插入排序算法在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入门之语句(if语句、while语句、for语句)
Jan 19 Python
windows环境下tensorflow安装过程详解
Mar 30 Python
用python编写第一个IDA插件的实例
May 29 Python
Python中使用__new__实现单例模式并解析
Jun 25 Python
Python使用Pandas库常见操作详解
Jan 16 Python
Python 实现向word(docx)中输出
Feb 13 Python
Django添加bootstrap框架时无法加载静态文件的解决方式
Mar 27 Python
Python 找出出现次数超过数组长度一半的元素实例
May 11 Python
Pytorch中Softmax与LogSigmoid的对比分析
Jun 05 Python
python编程实现清理微信重复缓存文件
Nov 01 Python
Selenium浏览器自动化如何上传文件
Apr 06 Python
Python中request的基本使用解决乱码问题
Apr 12 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
落伍首发 php+mysql 采用ajax技术的 省 市 地 3级联动无刷新菜单 源码
2006/12/16 PHP
用PHP实现多服务器共享SESSION数据的方法
2007/03/16 PHP
PHP中usort在值相同时改变原始位置问题的解决方法
2011/11/27 PHP
php.ini中的request_order推荐设置
2015/05/10 PHP
javascript 原型模式实现OOP的再研究
2009/04/09 Javascript
js操纵跨frame的三级联动select下拉选项实例介绍
2013/05/19 Javascript
js中浮点型运算BUG的解决方法说明
2014/01/06 Javascript
动态添加删除表格行的js实现代码
2014/02/28 Javascript
javascript正则表达式使用replace()替换手机号的方法
2015/01/19 Javascript
JS中处理时间之setUTCMinutes()方法的使用
2015/06/12 Javascript
JavaScript中闭包的写法和作用详解
2016/06/29 Javascript
AngularJS使用ng-repeat指令实现下拉框
2016/08/23 Javascript
微信小程序 引用其他js文件实现代码
2017/02/22 Javascript
jQuery点击头像上传并预览图片
2017/02/23 Javascript
原生JS京东轮播图代码
2017/03/22 Javascript
使用requirejs模块化开发多页面一个入口js的使用方式
2017/06/14 Javascript
JS逻辑运算符短路操作实例分析
2018/07/09 Javascript
对angularJs中controller控制器scope父子集作用域的实例讲解
2018/10/08 Javascript
layer弹出层自定义提交取消按钮的例子
2019/09/10 Javascript
原生js实现贪吃蛇游戏
2020/10/26 Javascript
python中的hashlib和base64加密模块使用实例
2014/09/02 Python
python实现将元祖转换成数组的方法
2015/05/04 Python
python 写入csv乱码问题解决方法
2016/10/23 Python
Python使用PDFMiner解析PDF代码实例
2017/03/27 Python
python+opencv轮廓检测代码解析
2018/01/05 Python
8种用Python实现线性回归的方法对比详解
2019/07/10 Python
决策树剪枝算法的python实现方法详解
2019/09/18 Python
wxPython多个窗口的基本结构
2019/11/19 Python
Jupyter notebook设置背景主题,字体大小及自动补全代码的操作
2020/04/13 Python
html5 Canvas画图教程(3)—canvas出现1像素线条模糊不清的原因
2013/01/09 HTML / CSS
塑料制成的可水洗的编织平底鞋和鞋子:Rothy’s
2018/09/16 全球购物
英国女鞋购物网站:Moda in Pelle
2019/02/18 全球购物
美国牙科折扣计划:DentalPlans.com
2019/08/26 全球购物
2014乡镇干部纪律作风整顿思想汇报
2014/09/13 职场文书
五好家庭事迹材料
2014/12/20 职场文书
教师个人总结范文
2015/02/11 职场文书