插入排序是学习算法时最先学到的一个算法,很简单,也许看一遍就会理解,从而觉得自己掌握这个基本的算法。但是很多人可能会像我一样,过了一段时间,提笔来写一下插入排序的伪代码,就很难写出书本上如此优雅的伪代码。
INSERTION_SORT(A):
For j=2 to A.length
key=A[j]
//insert A[j] to A[1,..,j-1]
i = j-1
while i > 0 and A[i] > key
A[i+1] = A[i]
i = i -1
A[i+1] = key
所以懂跟掌握真是两回事,要能随时随手写出这几行代码,首先要掌握设计这段代码的思想,其次要有清晰的逻辑,我相信伪代码写得漂亮的人,一定是编程高手。
插入排序的核心思想是代码中注释,把A[j]插入到已排序的A[1,..,j-1]中后,并保证插入后的A[1,..,j]仍然是排好序的,把这个过程从2循环到n,显然当j为2时A[1,..,j-1]等于A[1]满足已排好序这个性质,所以当j迭代为n时,将A[n]插入到A[1,..,n-1]后A[1,..,n]就排好序了。书面上把A[1,..,j-1]的这些特性形式地叫循环不变式。
用循环不变式逻辑很清晰的表明了算法的正确性
最后是如何简洁的把一个值如何正确的插入到已排序的数组中:
在将A[j]插入到A[1,..,j-1]中时,用一个循环变量i从j-1往前循环查找比A[j]大的值都往后移一位,当遇到比key小的时候终止,并把key插入到循环变量后面的位置(i+1)上。