浅谈插入排序算法在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实现决策树分类算法
Dec 21 Python
python奇偶行分开存储实现代码
Mar 19 Python
Python实现在某个数组中查找一个值的算法示例
Jun 27 Python
python 实现对数据集的归一化的方法(0-1之间)
Jul 17 Python
NLTK 3.2.4 环境搭建教程
Sep 19 Python
Python实现的特征提取操作示例
Dec 03 Python
Python实现EXCEL表格的排序功能示例
Jun 25 Python
WxPython实现无边框界面
Nov 18 Python
python numpy 反转 reverse示例
Dec 04 Python
python中str内置函数用法总结
Dec 27 Python
Python绘制分类图的方法
Apr 20 Python
基于Python和openCV实现图像的全景拼接详细步骤
Oct 05 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缓存技术的使用说明
2011/08/06 PHP
使用Sphinx对索引进行搜索
2013/06/25 PHP
如何解决CI框架的Disallowed Key Characters错误提示
2013/07/05 PHP
php页码形式分页函数支持静态化地址及ajax分页
2014/03/28 PHP
PHP不用递归遍历目录下所有文件的代码
2014/07/04 PHP
PHP flush 函数使用注意事项
2016/08/26 PHP
php工具型代码之印章抠图
2018/07/18 PHP
IE6下CSS图片缓存问题解决方法
2010/12/09 Javascript
没有document.getElementByName方法
2013/08/19 Javascript
批量修改标签css样式以input标签为例
2014/07/31 Javascript
js动态创建及移除div的方法
2015/06/03 Javascript
浅谈Node.js中的定时器
2015/06/18 Javascript
JS实现字符串转日期并比较大小实例分析
2015/12/09 Javascript
bootstrap+jQuery 实现下拉菜单中复选框全选和全不选效果
2017/06/12 jQuery
详解js类型判断
2018/05/22 Javascript
细说webpack6 Babel的使用详解
2019/09/26 Javascript
JavaScript 禁止用户保存图片的实现代码
2020/04/28 Javascript
TF-IDF算法解析与Python实现方法详解
2017/11/16 Python
Python中getpass模块无回显输入源码解析
2018/01/11 Python
python复制文件到指定目录的实例
2018/04/27 Python
2019 Python最新面试题及答案16道题
2019/04/11 Python
Django中如何使用sass的方法步骤
2019/07/09 Python
python 实现多维数组(array)排序
2020/02/28 Python
Python虚拟环境virtualenv创建及使用过程图解
2020/12/08 Python
ziaja齐叶雅官方海外旗舰店:来自波兰的天然护肤品牌
2017/01/02 全球购物
欧洲最大的拼图游戏商店:JigsawPuzzle.co.uk
2018/07/04 全球购物
科颜氏印度官网:Kiehl’s印度
2021/02/20 全球购物
股权转让协议书
2014/04/12 职场文书
2015年护士长个人工作总结
2015/04/24 职场文书
幼儿园小班开学寄语
2015/05/27 职场文书
法定代表人身份证明书
2015/06/18 职场文书
oracle DGMGRL ORA-16603报错的解决方法(DG Broker)
2021/04/06 Oracle
pandas:get_dummies()与pd.factorize()的用法及区别说明
2021/05/21 Python
Sleuth+logback 设置traceid 及自定义信息方式
2021/07/26 Java/Android
vue报错function () { [native code] },无法出现我们想要的内容 Unknown custom element
2022/04/11 Vue.js
Mysql中的触发器定义及语法介绍
2022/06/25 MySQL