码迷,mamicode.com
首页 > 编程语言 > 详细

八大排序算法之插入排序

时间:2017-11-27 11:12:53      阅读:118      评论:0      收藏:0      [点我收藏+]

标签:.sh   after   outline   方法   repeat   ber   djang   proc   property   

  • 我们一般最开始接触的排序就是插入排序,它看上去非常简单,可是如果没有弄清楚他的细节,自己手写一个插入排序,也是会出各种错,甚至就是写不出来,直到看到答案,再恍然大悟,奥,然后下次还是写不出,不用说,本人就经历过几次这样的情景,所以,虽然简单,还是有必要踏踏实实弄清楚这个最基础的算法。

处理方法

  1. 初始状态:有一个n个元素的数组待排序,迭代指针初始为第二个元素 (下标为1),设该元素为key,key左侧的元素在初始时是有序的,很好理解,因为初始时,key左侧只有一个元素,一个元素是有序的。

  2. 迭代状态:将key插入左侧有序的数组,然后迭代指针右移一位。

  3. 终止状态:迭代指针到了整个数组的最后一位,并将最后一位插入到了左侧对应的位置,排序完成。

细节处理

  • 我们用最简单的整数排序来做例子
  • c是一个整数数组, 变量i用来标志1到len(c)的数组下标,初始时i = 1, key = c[i] = c[1],变量j用来标志key左侧有序数组的下标,初始时,j = 0,c[j] = c[0]
  • 我们需要用一个双层循环来处理这个排序,外层循环的上下界是1和len(c), 左侧已排序的数组的上下界是0和j
  • 如下代码:
c = []
for i in range(5):
    item = int(raw_input("请输入数值:"))
    c.append(item)

length = len(c)
for i in range(1, length):
    j = i - 1
    key = c[i]
    while j >= 0:
        if key < c[j]:
            c[j], c[j + 1] = c[j + 1], c[j]
        j -= 1

print c

外层循环,是由前向后迭代1-len(c),内层循环是由后向前迭代0-j,如果key小于c[j],就交换c[j]和c[j+1],j-=1

ps

  • 用python实现这个排序,网上有很多教程,在交换c[j]和c[j+1]的时候,引入了一个中间变量,像c语言,两个值交换的时候,需要引入中间变量,但是在python里,可以直接交换,上面这样写比较pythonic。

八大排序算法之插入排序

标签:.sh   after   outline   方法   repeat   ber   djang   proc   property   

原文地址:http://www.cnblogs.com/becker/p/7902782.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!