浅谈插入排序算法在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 相关文章推荐
CentOS 7下安装Python 3.5并与Python2.7兼容并存详解
Jul 07 Python
Python 基础教程之str和repr的详解
Aug 20 Python
Tensorflow 同时载入多个模型的实例讲解
Jul 27 Python
Django中URL的参数传递的实现
Aug 04 Python
调试Django时打印SQL语句的日志代码实例
Sep 12 Python
淘宝秒杀python脚本 扫码登录版
Sep 19 Python
python分布式计算dispy的使用详解
Dec 22 Python
Python基于pyecharts实现关联图绘制
Mar 27 Python
python访问hdfs的操作
Jun 06 Python
Python类的继承super相关原理解析
Oct 22 Python
python实现学生信息管理系统(精简版)
Nov 27 Python
python实现高效的遗传算法
Apr 07 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获取当前文件所在目录 getcwd()函数
2009/05/13 PHP
php Undefined index的问题
2009/06/01 PHP
php引用传值实例详解学习
2013/11/06 PHP
php获得网站访问统计信息类Compete API用法实例
2015/04/02 PHP
Yii2下session跨域名共存的解决方案
2017/02/04 PHP
三级下拉菜单的js实现代码
2011/05/23 Javascript
深入理解JavaScript系列(44):设计模式之桥接模式详解
2015/03/04 Javascript
通用无限极下拉菜单的实现代码
2016/05/31 Javascript
AngularJS过滤器详解及示例代码
2016/08/16 Javascript
js动态生成form 并用ajax方式提交的实现方法
2016/09/09 Javascript
DropDownList实现可输入可选择(两种版本可选)
2016/12/07 Javascript
JSON键值对序列化和反序列化解析
2017/01/24 Javascript
Bootstarp基本模版学习教程
2017/02/01 Javascript
easyui-datagrid特殊字符不能显示的处理方法
2017/04/12 Javascript
python爬取安居客二手房网站数据(实例讲解)
2017/10/19 Javascript
Vue父子模版传值及组件传值的三种方法
2017/11/27 Javascript
p5.js实现斐波那契螺旋的示例代码
2018/03/22 Javascript
jquery的 filter()方法使用教程
2018/03/22 jQuery
js正则相关知识点专题
2018/05/10 Javascript
Vue实现 点击显示再点击隐藏效果(点击页面空白区域也隐藏效果)
2020/01/16 Javascript
Vue插件之滑动验证码用法详解
2020/04/05 Javascript
Python实现微信公众平台自定义菜单实例
2015/03/20 Python
Python的re模块正则表达式操作
2016/05/25 Python
Python中将变量按行写入txt文本中的方法
2018/04/03 Python
Python实现的对本地host127.0.0.1主机进行扫描端口功能示例
2019/02/15 Python
Python3 requests文件下载 期间显示文件信息和下载进度代码实例
2019/08/16 Python
pandas factorize实现将字符串特征转化为数字特征
2019/12/19 Python
Python用input输入列表的实例代码
2020/02/07 Python
python中68个内置函数的总结与介绍
2020/02/24 Python
django中related_name的用法说明
2020/05/20 Python
CSS3实现的炫酷菜单代码分享
2015/03/12 HTML / CSS
CSS3的一个简单导航栏实现
2015/08/03 HTML / CSS
世界上最大的专业美容用品零售商:Sally Beauty
2017/07/02 全球购物
主要的Ajax框架都有什么
2013/11/14 面试题
生死抉择观后感
2015/06/09 职场文书
公司业务员管理制度
2015/08/05 职场文书