浅谈插入排序算法在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 控制语句
Nov 03 Python
python里大整数相乘相关技巧指南
Sep 12 Python
在Python中调用ggplot的三种方法
Apr 08 Python
python下os模块强大的重命名方法renames详解
Mar 07 Python
Python+pandas计算数据相关系数的实例
Jul 03 Python
Python button选取本地图片并显示的实例
Jun 13 Python
Python Pandas实现数据分组求平均值并填充nan的示例
Jul 04 Python
pycharm无法导入本地模块的解决方式
Feb 12 Python
Python预测2020高考分数和录取情况
Jul 08 Python
django inspectdb 操作已有数据库数据的使用步骤
Feb 07 Python
总结Pyinstaller打包的高级用法
Jun 28 Python
JAVA SpringMVC实现自定义拦截器
Mar 16 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 编程安全性小结
2010/01/08 PHP
php+ajax制作无刷新留言板
2015/10/27 PHP
PHP编程入门的基本语法知识点总结
2016/01/26 PHP
php+mysql+ajax实现单表多字段多关键词查询的方法
2017/04/15 PHP
javascript学习随笔(使用window和frame)的技巧
2007/03/08 Javascript
调用js时ie6和ie7,ff的区别
2009/08/19 Javascript
基于jQuery实现的当离开页面时出现提示的实现代码
2011/06/27 Javascript
contains和compareDocumentPosition 方法来确定是否HTML节点间的关系
2011/09/13 Javascript
打豆豆小游戏 用javascript编写的[打豆豆]小游戏
2013/01/08 Javascript
10个基于浏览器的JavaScript调试工具分享
2013/02/07 Javascript
jQuery的cookie插件实现保存用户登陆信息
2014/04/15 Javascript
jQuery使用attr()方法同时设置多个属性值用法实例
2015/03/26 Javascript
详解vue.js组件化开发实践
2016/12/14 Javascript
jQuery编写设置和获取颜色的插件
2017/01/09 Javascript
详解javascript立即执行函数表达式IIFE
2017/02/13 Javascript
React通过父组件传递类名给子组件的实现方法
2017/11/13 Javascript
微信小程序 JS动态修改样式的实现方法
2018/12/16 Javascript
JavaScript使用面向对象实现的拖拽功能详解
2019/06/12 Javascript
JS继承实现方法及优缺点详解
2020/09/02 Javascript
小程序实现录音功能
2020/09/22 Javascript
[01:17:55]VGJ.T vs Mineski 2018国际邀请赛小组赛BO2 第一场 8.18
2018/08/20 DOTA
python利用elaphe制作二维条形码实现代码
2012/05/25 Python
python动态监控日志内容的示例
2014/02/16 Python
python中Flask框架简单入门实例
2015/03/21 Python
python基于phantomjs实现导入图片
2016/05/13 Python
django批量导入xml数据
2016/10/16 Python
python出现&quot;IndentationError: unexpected indent&quot;错误解决办法
2017/10/15 Python
在PyCharm中三步完成PyPy解释器的配置的方法
2018/10/29 Python
python实现图书借阅系统
2019/02/20 Python
tensorboard 可以显示graph,却不能显示scalar的解决方式
2020/02/15 Python
关于多种方式完美解决Python pip命令下载第三方库的问题
2020/12/21 Python
健康监测猫砂:Pretty Litter
2017/05/25 全球购物
Ramy Brook官网:美国现代女装品牌
2019/06/18 全球购物
2014年最新大专生职业生涯规划书范文
2014/09/13 职场文书
运动会班级前导词
2015/07/20 职场文书
教您怎么制定西餐厅运营方案 ?
2019/07/05 职场文书