浅谈插入排序算法在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通过文件头判断文件类型
Oct 30 Python
Python 类的继承实例详解
Mar 25 Python
Python使用time模块实现指定时间触发器示例
May 18 Python
python类的方法属性与方法属性的动态绑定代码详解
Dec 27 Python
python监控键盘输入实例代码
Feb 09 Python
Python中defaultdict与lambda表达式用法实例小结
Apr 09 Python
python程序封装为win32服务的方法
Mar 07 Python
详解安装mitmproxy以及遇到的坑和简单用法
Jan 21 Python
Python数据处理篇之Sympy系列(五)---解方程
Oct 12 Python
Python实现中值滤波去噪方式
Dec 18 Python
Django3中的自定义用户模型实例详解
Aug 23 Python
python爬取某网站原图作为壁纸
Jun 02 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
highchart数据源纵轴json内的值必须是int(详解)
2017/02/20 PHP
Laravel学习教程之路由模块
2017/08/18 PHP
PHP7修改的函数
2021/03/09 PHP
jquery prop的使用介绍及与attr的区别
2013/12/19 Javascript
Jquery ajax加载等待执行结束再继续执行下面代码操作
2015/11/24 Javascript
Bootstrap table两种分页示例
2016/12/23 Javascript
angular实现IM聊天图片发送实例
2017/05/08 Javascript
element-ui 关于获取select 的label值方法
2018/08/24 Javascript
express 项目分层实践详解
2018/12/10 Javascript
vue input实现点击按钮文字增删功能示例
2019/01/29 Javascript
layUI实现前端分页和后端分页
2019/07/27 Javascript
详解mpvue实现对苹果X安全区域的适配
2019/07/31 Javascript
这15个Vue指令,让你的项目开发爽到爆
2019/10/11 Javascript
如何优雅地在Node应用中进行错误异常处理
2019/11/25 Javascript
详解Vue的异步更新实现原理
2020/12/22 Vue.js
实例讲解python中的协程
2018/10/08 Python
python通过TimedRotatingFileHandler按时间切割日志
2019/07/17 Python
python 扩展print打印文件路径和当前时间信息的实例代码
2019/10/11 Python
如何利用python web框架做文件流下载的实现示例
2020/06/02 Python
Python小白学习爬虫常用请求报头
2020/06/03 Python
python3将变量输入的简单实例
2020/08/19 Python
css3media响应式布局实例
2016/07/08 HTML / CSS
英国银首饰公司:e&e Jewellery
2021/02/11 全球购物
中科软测试工程师面试题
2012/06/16 面试题
九州传奇上机题
2014/07/10 面试题
领导干部廉政承诺书
2014/03/27 职场文书
高考寄语大全
2014/04/08 职场文书
购房协议书
2014/04/11 职场文书
贵阳市党的群众路线教育实践活动党(工)委领导班子整改方案
2014/10/26 职场文书
Vue3 Composition API的使用简介
2021/03/29 Vue.js
goland设置颜色和字体的操作
2021/05/05 Golang
详细谈谈MYSQL中的COLLATE是什么
2021/06/11 MySQL
gateway网关接口请求的校验方式
2021/07/15 Java/Android
css 边框添加四个角的实现代码
2021/10/16 HTML / CSS
vue配置型表格基于el-table拓展之table-plus组件
2022/04/12 Vue.js
服务器间如何实现文件共享
2022/05/20 Servers