浅谈插入排序算法在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中的装饰器详解
Apr 13 Python
使用Python生成XML的方法实例
Mar 21 Python
基于python3 OpenCV3实现静态图片人脸识别
May 25 Python
Python操作mongodb的9个步骤
Jun 04 Python
Python基于OpenCV库Adaboost实现人脸识别功能详解
Aug 25 Python
Python 正则表达式匹配字符串中的http链接方法
Dec 25 Python
详解python项目实战:模拟登陆CSDN
Apr 04 Python
Python Web版语音合成实例详解
Jul 16 Python
Django 通过JS实现ajax过程详解
Jul 30 Python
Python实现的北京积分落户数据分析示例
Mar 27 Python
python实现企业微信定时发送文本消息的实例代码
Nov 25 Python
python多线程和多进程关系详解
Dec 14 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
PHP5 面向对象程序设计
2008/02/13 PHP
编写漂亮的代码 - 将后台程序与前端程序分开
2008/04/23 PHP
一个php短网址的生成代码(仿微博短网址)
2014/05/07 PHP
php基于socket实现SMTP发送邮件的方法
2015/03/05 PHP
javascript判断iphone/android手机横竖屏模式的函数
2011/12/20 Javascript
解决IE6的PNG透明JS插件使用介绍
2013/04/17 Javascript
用jQuery实现一些导航条切换,显示隐藏的实例代码
2013/06/08 Javascript
javascript使用正则控制input输入框允许输入的值方法大全
2014/06/19 Javascript
Javascript调用函数方法的几种方式介绍
2015/03/20 Javascript
Angularjs使用directive自定义指令实现attribute继承的方法详解
2016/08/05 Javascript
js时间比较 js计算时间差的简单实现方法
2016/08/26 Javascript
微信小程序 window_x64环境搭建
2016/09/30 Javascript
javascript动画之磁性吸附效果篇
2016/12/09 Javascript
jQuery validate插件功能与用法详解
2016/12/15 Javascript
jQuery实现的手风琴侧边菜单效果
2017/03/29 jQuery
vue中本地静态图片路径写法
2018/03/06 Javascript
jQuery 点击获取验证码按钮及倒计时功能
2018/09/20 jQuery
vue最简单的前后端交互示例详解
2018/10/11 Javascript
详解如何制作并发布一个vue的组件的npm包
2018/11/10 Javascript
js实现轮播图效果 纯js实现图片自动切换
2020/08/09 Javascript
ES6学习教程之Promise用法详解
2020/11/22 Javascript
对Python发送带header的http请求方法详解
2019/01/02 Python
基于python实现高速视频传输程序
2019/05/05 Python
python2.7 安装pip的方法步骤(管用)
2019/05/05 Python
Python操作Sqlite正确实现方法解析
2020/02/05 Python
Pycharm 安装 idea VIM插件的图文教程详解
2020/02/21 Python
html5 worker 实例(二) 图片变换效果
2013/06/24 HTML / CSS
解锁canvas导出图片跨域的N种姿势小结
2019/01/24 HTML / CSS
yy司仪主持词
2014/03/22 职场文书
小区文明倡议书
2014/05/16 职场文书
电焊工岗位工作职责
2014/07/09 职场文书
投标承诺函范文
2015/01/21 职场文书
员工离职感谢信
2015/01/22 职场文书
2016年习主席讲话学习心得体会
2016/01/20 职场文书
导游词之清晏园
2019/11/22 职场文书
Android Studio 计算器开发
2022/05/20 Java/Android