实现原理

将每一个元素插入到已经有序的元素中的适当位置。为了腾出空间,需要将后面的元素一次向右移动以为。

效率分析

插入排序所需的时间取决于输入元素的初始顺序。对一个部分有序的数组进行排列比随机数组效率高很多。

代码实现

方式1:使用当前元素和之前的每一个元素进行对比,如果位置不对就交换两个元素的位置

  1. func sort(a []int) {
  2. N := len(a)
  3. for i := 1; i < N; i++ {
  4. for j := i; j > 0 && less(a[j], a[j - 1]); j-- {
  5. exch(a, j, j - 1)
  6. }
  7. }
  8. }

方式2:将内循环中较大的元素向右移动而不是交换位置

  1. func sort(a []int) {
  2. N := len(a)
  3. for i := 1; i < N; i++ {
  4. num := a[i]
  5. j := i
  6. for ; j > 0 && less(num, a[j - 1]); j-- {
  7. a[j] = a[j - 1]
  8. }
  9. a[j] = num
  10. }
  11. }