一. 原理
现在想象一下手里有五张牌:
现在对这几张进行排序,最后在手里我们希望得到顺序是从小到大increasing这样的五张牌:
插入排序的过程:
现在一个一个的将这些红桃牌提取出来比较再将他们插入正确的位置。
- 首先将红桃2提取出来当作一个子序列,现在这个子序列已经是排好序的了,因为它只包含红桃2一个元素。原来的序列已经被分成了两部分,一部分是已经排好序的(红桃2),另一部分是没有进行排序的(红桃9、红桃5、红桃10、红桃7)
- 接下来将未排序中的元素红桃9提取出来,红桃9原来的位置用灰色格子代替,于是这幅牌的就变成了这个样子:
将红桃9与排好序的这个子序列的元素做比较(子序列中只有红桃2这一个元素的这个序列),红桃9比左边的红桃2大。好了,将红桃9加入子序列并与灰色格子进行交换。现在这个有序的子序列中包含红桃2和红桃9这两个元素了
现在的序列是这个样子的了:
- 现在一次将红桃5提取出来:
再将红桃5与左边这个子序列中的元素一一做比较,首先红桃5和红桃9做比较,红桃5比红桃9小,灰色格子和红桃9做交换:
接下来将红桃5和红桃2比较,红桃5比红桃2大。于是将红桃5插入到灰色格子。现在的序列长这个样子了:
- 再重复这个过程,将红桃10提取出来分别与左边的子序列中的元素红桃9,红桃5和红桃2依次做比较直到找到了它的插入位置:
由于红桃10比红桃9大,于是将红桃10插入灰格子,于是有了下面这个序列,左边是已经是排好序的子序列,右边是未进行排序的子序列:
- 接下来最后一个元素,将7提取出来与左边的子序列进行比较:
首先7比10小,于是将10与灰色格子交换:
再将7与9做比较,7比9小,于是将9与灰色格子交换:
再将7与5做比较,7比5大,于是把7插入灰色格子处就得到了排好序的扑克牌了:
总结:
插入排序就是将原来的序列分子两个子序列,一个是有序的子序列,一个是无序的子序列。将无序中的子序列一一提取出来分别与有序的序列中的元素做比较。若提取出的这个元素比有序子序列的元素小,那就将这两个元素交换位置, 于是再与有序子序列中的下一个元素做比较,如果还是这个元素小,就又交换这两个元素的位置,若是这个元素大的话,那就这个元素的位置此刻的位置就是在有序子序列中应该所在的位置。重复这个过程,将无序序列中的元素提取并比较完毕就得到了整个有序的序列了。最后放入python代码:
### increasing sort ###
def insertion_sort_increasing(data_list):
n = len(data_list) # this is the length for this list
for j in range(1, n): #
key = data_list[j]
i = j-1
while i >= 0 and data_list[i] > key:
data_list[i+1] = data_list[i]
i -= 1
data_list[i+1] = key
return data_list
if __name__ == '__main__':
A = [31, 41, 59, 26, 40, 58]
sorted_ = insertion_sort_increasing(A)
print (sorted_)
### decreasing sort ###
def insertion_sort_decreasing(data_list):
n = len(data_list)
for j in range(1, n):
key = data_list[j]
i = j - 1
while i>=0 and data_list[i] < key:
data_list[i+1] = data_list[i]
i -= 1
data_list[i+1] = key
return data_list
if __name__ == '__main__':
A = [31, 41, 59, 26, 40, 25, 58]
sorted_ = insertion_sort_decreasing(A)
print (sorted_)