浅谈插入排序算法在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中比较运算符的使用
May 13 Python
在arcgis使用python脚本进行字段计算时是如何解决中文问题的
Oct 18 Python
使用rst2pdf实现将sphinx生成PDF
Jun 07 Python
Python实现对字符串的加密解密方法示例
Apr 29 Python
对python3中, print横向输出的方法详解
Jan 28 Python
详解Python3定时器任务代码
Sep 23 Python
python 扩展print打印文件路径和当前时间信息的实例代码
Oct 11 Python
python常见字符串处理函数与用法汇总
Oct 30 Python
用python画一只可爱的皮卡丘实例
Nov 21 Python
妙用itchat! python实现久坐提醒功能
Nov 25 Python
python GUI库图形界面开发之PyQt5信号与槽多窗口数据传递详细使用方法与实例
Mar 08 Python
解决python Jupyter不能导入外部包问题
Apr 15 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面向对象全攻略 (八)重载新的方法
2009/09/30 PHP
php 广告调用类代码(支持Flash调用)
2011/08/11 PHP
PHP内核探索:变量存储与类型使用说明
2014/01/30 PHP
浅析ThinkPHP中execute和query方法的区别
2014/06/13 PHP
php循环table实现一行两列显示的方法
2015/06/04 PHP
功能强大的PHP POST提交数据类
2016/07/15 PHP
thinkPHP实现多字段模糊匹配查询的方法
2016/12/01 PHP
JavaScript 语言基础知识点总结(思维导图)
2013/11/10 Javascript
jQuery预加载图片常用方法
2015/06/15 Javascript
pace.js页面加载进度条插件
2015/09/29 Javascript
五种js判断是否为整数类型方式
2015/12/03 Javascript
Javascript基础之数组的使用
2016/05/13 Javascript
基于react后端渲染模板引擎noox发布使用
2018/01/11 Javascript
JS和Canvas实现图片的预览压缩和上传功能
2018/03/30 Javascript
JS数组去重的6种方法完整实例
2018/12/08 Javascript
vscode下vue项目中eslint的使用方法
2019/01/13 Javascript
Vue.js实现的购物车功能详解
2019/01/27 Javascript
JS实现使用POST方式发送请求
2019/08/30 Javascript
[08:17]Ti9 现场cosplay
2019/09/10 DOTA
python实现自动登录人人网并访问最近来访者实例
2014/09/26 Python
python实现在windows下操作word的方法
2015/04/28 Python
Python实现八大排序算法
2016/08/13 Python
python实现对csv文件的列的内容读取
2018/07/04 Python
在Python中输入一个以空格为间隔的数组方法
2018/11/13 Python
python实现视频分帧效果
2019/05/31 Python
python 读写excel文件操作示例【附源码下载】
2019/06/19 Python
python取余运算符知识点详解
2019/06/27 Python
Python使用random模块生成随机数操作实例详解
2019/09/17 Python
Python属性和内建属性实例解析
2020/01/14 Python
解决echarts中饼图标签重叠的问题
2020/05/16 Python
HTML5 CSS3给网站设计带来出色效果
2009/07/16 HTML / CSS
建筑专业自荐信
2013/10/18 职场文书
岗位职责风险防控
2014/02/18 职场文书
医院护士见习期自我鉴定
2014/04/10 职场文书
毕业生找工作自荐书
2014/06/30 职场文书
2015年世界环境日活动总结
2015/02/11 职场文书