浅谈插入排序算法在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中的迭代器和生成器
Oct 26 Python
Python单例模式的两种实现方法
Aug 14 Python
教你使用python实现微信每天给女朋友说晚安
Mar 23 Python
flask中过滤器的使用详解
Aug 01 Python
Python3中的最大整数和最大浮点数实例
Jul 09 Python
python opencv捕获摄像头并显示内容的实现
Jul 11 Python
python实现图片九宫格分割
Mar 07 Python
使用Python制作新型冠状病毒实时疫情图
Jan 28 Python
Python实现获取当前目录下文件名代码详解
Mar 10 Python
简单了解Python多态与属性运行原理
Jun 15 Python
python线性插值解析
Jul 05 Python
Python如何实现远程方法调用
Aug 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实现让页面只能被百度gogole蜘蛛访问的方法
2009/12/29 PHP
PHP的array_diff()函数在处理大数组时的效率问题
2011/11/27 PHP
解析用PHP实现var_export的详细介绍
2013/06/20 PHP
Yii2表单事件之Ajax提交实现方法
2017/05/04 PHP
浅谈Laravel中的一个后期静态绑定
2017/08/11 PHP
通过实例解析PHP数据类型转换方法
2020/07/11 PHP
了解jQuery技巧来提高你的代码
2010/01/08 Javascript
Jquery从头学起第四讲 jquery入门教程
2010/08/01 Javascript
Json对象与Json字符串互转(4种转换方式)
2013/03/27 Javascript
JQuery实现当鼠标停留在某区域3秒后自动执行
2014/09/09 Javascript
浅谈nodeName,nodeValue,nodeType,typeof 的区别
2015/01/13 Javascript
JS模式之单例模式基本用法
2015/06/30 Javascript
js实现简单的验证码
2015/12/25 Javascript
Jquery实现$.fn.extend和$.extend函数
2016/04/14 Javascript
Angularjs中使用指令绑定点击事件的方法
2017/03/30 Javascript
socket.io学习教程之基本应用(二)
2017/04/29 Javascript
史上最全JavaScript数组去重的十种方法(推荐)
2017/08/17 Javascript
Vue 权限控制的两种方法(路由验证)
2019/08/16 Javascript
nuxt踩坑之Vuex状态树的模块方式使用详解
2019/09/06 Javascript
vue中使用[provide/inject]实现页面reload的方法
2019/09/30 Javascript
js实现筛选功能
2020/11/24 Javascript
[54:19]完美世界DOTA2联赛PWL S2 Magma vs PXG 第二场 11.28
2020/12/01 DOTA
python中解析json格式文件的方法示例
2017/05/03 Python
基于Python3.6+splinter实现自动抢火车票
2018/09/25 Python
pytorch实现从本地加载 .pth 格式模型
2020/02/14 Python
解决PyCharm IDE环境下,执行unittest不生成测试报告的问题
2020/09/03 Python
Python jieba结巴分词原理及用法解析
2020/11/05 Python
pycharm 实现调试窗口恢复
2021/02/05 Python
HTML5中的websocket实现直播功能
2018/05/21 HTML / CSS
Seavenger官网:潜水服、浮潜、靴子和袜子
2020/03/05 全球购物
检查接待方案
2014/02/27 职场文书
ktv筹备计划书
2014/05/03 职场文书
师德模范事迹材料
2014/06/03 职场文书
公司活动总结范文
2014/07/01 职场文书
在职员工证明书
2014/09/19 职场文书
适合毕业生创业的项目怎么找?
2019/08/08 职场文书