浅谈插入排序算法在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中enumerate的用法实例解析
Aug 18 Python
基于wxpython实现的windows GUI程序实例
May 30 Python
详解Python验证码识别
Jan 25 Python
python深度优先搜索和广度优先搜索
Feb 07 Python
python3学习笔记之多进程分布式小例子
Feb 13 Python
Ubuntu下使用Python实现游戏制作中的切分图片功能
Mar 30 Python
Python面向对象之反射/自省机制实例分析
Aug 24 Python
python 五子棋如何获得鼠标点击坐标
Nov 04 Python
Anaconda 查看、创建、管理和使用python环境的方法
Dec 03 Python
python 实现读取csv数据,分类求和 再写进 csv
May 18 Python
浅谈tensorflow模型保存为pb的各种姿势
May 25 Python
Python简单实现词云图代码及步骤解析
Jun 04 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
zend framework多模块多布局配置
2011/02/26 PHP
php学习笔记 数组遍历实现代码
2011/06/09 PHP
php curl_init函数用法
2014/01/31 PHP
ThinkPHP实现分页功能
2017/04/28 PHP
PHP实现RSA签名生成订单功能【支付宝示例】
2017/06/06 PHP
PHP-FPM的配置与优化讲解
2019/03/15 PHP
Javascript Math对象
2009/08/13 Javascript
jQuery 判断页面元素是否存在的代码
2009/08/14 Javascript
别了 JavaScript中的isXX系列
2012/08/01 Javascript
js多级树形弹出一个小窗口层(非常好用)实例代码
2013/03/19 Javascript
基于NodeJS的前后端分离的思考与实践(五)多终端适配
2014/09/26 NodeJs
JavaScript中的splice()方法使用详解
2015/06/09 Javascript
javascript+html5实现绘制圆环的方法
2015/07/28 Javascript
Angularjs中如何使用filterFilter函数过滤
2016/02/06 Javascript
BootStrap Progressbar 实现大文件上传的进度条的实例代码
2016/06/27 Javascript
AngularJS控制器之间的通信方式详解
2016/11/03 Javascript
javascript显示系统当前时间代码
2016/12/29 Javascript
Ajax和Comet技术总结
2017/02/19 Javascript
jQuery布局组件EasyUI Layout使用方法详解
2017/02/28 Javascript
微信浏览器禁止页面下拉查看网址实例详解
2017/06/28 Javascript
利用jQuery+localStorage实现一个简易的计时器示例代码
2017/12/25 jQuery
bootstrap table表格插件之服务器端分页实例代码
2018/09/12 Javascript
jQuery提示框插件SweetAlert用法分析
2019/08/05 jQuery
vue的keep-alive用法技巧
2019/08/15 Javascript
6种JavaScript继承方式及优缺点(小结)
2020/02/06 Javascript
javascript History对象原理解析
2020/02/17 Javascript
原生js实现密码强度验证功能
2020/03/18 Javascript
微信小程序中target和currentTarget的区别小结
2020/11/06 Javascript
python中MethodType方法介绍与使用示例
2017/08/03 Python
WoolOvers澳洲官方网站:英国针织服装公司
2018/05/13 全球购物
泰国排名第一的家居用品中心:HomePro
2020/11/18 全球购物
《独坐敬亭山》教学反思
2014/04/08 职场文书
给老婆的保证书范文
2014/04/28 职场文书
物业管理专业自荐信
2014/07/01 职场文书
交通肇事罪辩护词
2015/05/21 职场文书
webpack介绍使用配置教程详解webpack介绍和使用
2022/06/25 Javascript