插入排序有点像打麻将时给麻将牌排序,其原理是假定一个有序区和一个无序区,一开始将给定的一系列值的第一个放到有序区,剩下的值放到无序区,然后从无序区取出第一个值,从后向前和有序区的值比较,找到它应该存在的位置(大于等于左边,小于右边)插入进去。然后再取出无序区的第一个值从后向前和有序区的值比较,找到属于它的位置,如此反复,直到无序区没有值了为止。
举个例子,假定有6,1,7,4,1,9,2这几个数字需要排序
首先,假定一个有序区和一个无序区,将上面的数字中的第一个放到有序区,其余的放到无序区。
第一轮,取出无序区的第一个数字1,和有序区的数字比较,有序区现在只有一个数字6,所以用1和6比较
因为1比6小,所以数字1应该插入到数字6的前面,第一轮结束
第二轮,取出无序区的第一个数字7,和有序区的倒数第一个数字6比较
因为数字7大于数字6,所以将数字7插入到数字6的后面,第二轮结束
第三轮,再取出无序区的第一个数字4,和有序区的倒数第一个数字7比较
因为数字4小于数字7,所以继续往前遍历有序区,用数字4和有序区倒数第二个数字6比较
因为数字4小于数字6,所以继续往前遍历有序区,用数字4和有序区倒数第三个数字1比较
因为数字4大于数字1,所以将数字4插入到数字1的后面,第三轮结束
第四轮,再从无序区取出第一个数字1,和有序区的倒数第一个数字7比较
因为1比7小,所以继续遍历有序区,和有序区的倒数第二个数字6比较
因为1比6小,所以继续遍历有序区,和有序区的倒数第三个数字4比较
因为1比4小,所以继续遍历有序区,和有序区的倒数第四个数字1比较
因为1等于1,所以将1插入到有序区倒数第四个数字1的后面,第四轮结束
第五轮,继续从无序区取出第一个数字9,和有序区倒数第一个数字7比较
因为数字9比数字7大,所以将数字9插入到数字7的后面,第五轮结束
第六轮,再从无序区取出第一个数字2,和有序区的倒数第一个数字9比较
因为2比9小,所以继续遍历有序区,和有序区的倒数第二个数字7比较
因为2比7小,所以继续遍历有序区,和有序区的倒数第三个数字6比较
因为2比6小,所以继续遍历有序区,和有序区的倒数第四个数字4比较
因为2比4小,所以继续遍历有序区,和有序区的倒数第五个数字1比较
因为2比1大,所以将数字2插入到数字1后面,第六轮结束
这时候,无序区没有值了,排序结束,有序区的数字顺序就是排序好的顺序。
所以对于给定n个值,插入排序可以总结出一下几点:
- 需要进行n-1轮比较
- 最坏的情况下(每次都需要比较完有序区的所有数字),第k轮需要比较k次,共需要比较1+2+3+...+n-1次,所以最坏情况下时间复杂度是O(n^2)
- 因为只需要一个额外空间来完成数字交换,所以空间复杂度是O(1)