白话插入排序

0 阅读1分钟

核心原理

将元素分为有序区(初始为第一个元素)和无序区,取无序区第一个元素和有序区元素依次比较,比这个元素大的往后稍,直到找到小于等于它的位置,然后把这个元素插进去。

通俗步骤

  1. 把数组第一个元素当作初始的有序区间;
  2. 依次取出无序区间的第一个元素,向前遍历有序区间;
  3. 比当前元素大的元素整体后移一位,直到找到小于等于它的位置;
  4. 将该元素插入空位;
  5. 重复直到全部有序。

举例演示 [3,1,4,2]

第一轮

[3]有序区间,[1,4,2]无序区间; 取无序区第一个数1依次和有序区[3]比较,3>1,将3后移,1插入3原来的位置;

第二轮

[1,3]有序区间,[4,2]无序区间; 取无序区第一个数1依次和有序区[1,3]比较,4>1且4>3,4插入末尾;

第三轮

[1,3,4]有序区间,[2]无序区间; 取无序区第一个数2依次和有序区[1,3,4]比较,2>1且2<3,将3,4后移,2插入3原来的位置;

此时排序完成,[1,2,3,4]

代码示例

package main

import (
	"fmt"
)

func main() {
	sortArr := []int{3, 1, 4, 2}
	fmt.Println("排序前:", sortArr)	// [3,1,4,2]
	fmt.Println("排序后:", insertionSort(sortArr))	// [1,2,3,4]
}

func insertionSort(arr []int) []int {
	arrLen := len(arr)
	for i := 1; i < arrLen; i++ {
		current := arr[i]
		j := i - 1
		for j >= 0 && arr[j] > current {
			arr[j+1] = arr[j]
			j--
		}
		arr[j+1] = current
	}
	return arr
}