内排序之直接插入排序
- 我们一般最开始接触的排序就是插入排序,它看上去非常简单,可是如果没有弄清楚他的细节,自己手写一个插入排序,也是会出各种错,甚至就是写不出来,直到看到答案,再恍然大悟,奥,然后下次还是写不出,不用说,本人就经历过几次这样的情景,所以,虽然简单,还是有必要踏踏实实弄清楚这个最基础的算法。
处理方法
-
初始状态:有一个n个元素的数组待排序,迭代指针初始为第二个元素 (下标为1),设该元素为key,key左侧的元素在初始时是有序的,很好理解,因为初始时,key左侧只有一个元素,一个元素是有序的。
-
迭代状态:将key插入左侧有序的数组,然后迭代指针右移一位。
-
终止状态:迭代指针到了整个数组的最后一位,并将最后一位插入到了左侧对应的位置,排序完成。
细节处理
- 我们用最简单的整数排序来做例子
- 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
- python2.x 如下代码:
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 and 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。