浅谈插入排序算法在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提取字典key列表的方法
Jul 11 Python
简单讲解Python中的字符串与字符串的输入输出
Mar 13 Python
Windows下搭建python开发环境详细步骤
Jul 20 Python
python实现名片管理系统
Nov 29 Python
Python中的Socket 与 ScoketServer 通信及遇到问题解决方法
Apr 01 Python
Python 实现文件读写、坐标寻址、查找替换功能
Sep 11 Python
TensorFlow学习之分布式的TensorFlow运行环境
Feb 05 Python
keras读取h5文件load_weights、load代码操作
Jun 12 Python
pandas数据处理之绘图的实现
Jun 15 Python
pyqt5实现井字棋的示例代码
Dec 07 Python
代码复现python目标检测yolo3详解预测
May 06 Python
python数字图像处理:图像的绘制
Jun 28 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
漫威DC御用漫画家去世 他的表情包曾走红网络
2020/04/09 欧美动漫
从零开始 教你如何搭建Discuz!4.1论坛
2006/07/07 PHP
php实现把数组按指定的个数分隔
2014/02/17 PHP
php实现将数据做成json的格式给前端使用
2018/08/21 PHP
php中的钩子理解及应用实例分析
2019/08/30 PHP
tp5.1 框架数据库-数据集操作实例分析
2020/05/26 PHP
禁止JQuery中的load方法装载IE缓存中文件的方法
2009/09/11 Javascript
javascript 面向对象继承
2009/11/26 Javascript
JQuery 写的个性导航菜单
2009/12/24 Javascript
JQuery入门——用bind方法绑定事件处理函数应用介绍
2013/02/05 Javascript
node.js中的fs.truncate方法使用说明
2014/12/15 Javascript
JavaScript计时器示例分析
2015/02/05 Javascript
JSONObject使用方法详解
2015/12/17 Javascript
jquery实现刷新随机变化样式特效(tag标签样式)
2017/02/03 Javascript
AngularJS 打开新的标签页实现代码
2017/09/07 Javascript
js实现点击选项置顶动画效果
2020/08/25 Javascript
[01:10:03]OG vs EG 2018国际邀请赛淘汰赛BO3 第三场 8.23
2018/08/24 DOTA
Windows下安装Scrapy
2018/10/17 Python
Python实现的特征提取操作示例
2018/12/03 Python
python实现支付宝转账接口
2019/05/07 Python
python版百度语音识别功能
2019/07/09 Python
Python3 ID3决策树判断申请贷款是否成功的实现代码
2020/05/21 Python
使用Django搭建网站实现商品分页功能
2020/05/22 Python
python中K-means算法基础知识点
2021/01/25 Python
纪伊国屋泰国网上书店:Kinokuniya泰国
2017/12/24 全球购物
拾金不昧表扬信范文
2014/01/11 职场文书
运动会通讯稿400字
2014/01/28 职场文书
2014年元旦活动方案
2014/02/15 职场文书
餐厅楼面主管岗位职责范本
2014/02/16 职场文书
公开服务承诺制度
2014/03/26 职场文书
企业授权委托书范本
2014/04/02 职场文书
工商局局长个人对照检查材料思想汇报
2014/09/23 职场文书
留学推荐信中文范文
2015/03/26 职场文书
2016年“12.3”国际残疾人日活动总结
2016/04/01 职场文书
写作技巧:优秀文案必备的3种结构
2019/08/19 职场文书
如何自己动手写SQL执行引擎
2021/06/02 MySQL