二分插入排序原理

二分法是对直接插入的改进,由直接插入排序的循环遍历找出插入点改为二分法找出插入点,时间复杂度O(nlogn)。
二分法插入排序是在插入第i个元素时,对前面的0~i-1元素进行折半,先跟他们中间的那个元素比,如果小,则对前半再进行折半, 否则对后半进行折半,直到left>right,然后再把第i个元素前1位与目标位置之间的所有元素后移,再把第i个元素放在目标位置上。

Golang实现

package main

import "fmt"

// 二分插入排序
// 算法思想简单描述:
//在插入第i个元素时,对前面的0~i-1元素进行折半,先跟他们
//中间的那个元素比,如果小,则对前半再进行折半,否则对后半
//进行折半,直到left>right,然后再把第i个元素前1位与目标位置之间
//的所有元素后移,再把第i个元素放在目标位置上。
func main() {

	array := []int{6, 7, 9, 3, 6, 8, 1, 9, 3}

	var start, end, temp, mid int

	for i := 1; i < len(array); i++ {

		start = 0
		end = i - 1
		temp = array[i]

		for start <= end {
			mid = (start + end) / 2
			if temp < array[mid] {
				end = mid - 1
			} else {
				start = mid + 1
			}
		}
		//循环完后,start=end+1,此时start为当前插入数字所待坑位
		//把坑位给当前插入的数据挪出来
		for j := i - 1; j >= start; j-- {
			array[j+1] = array[j]
		}
		//将当前插入数字挪入它该待的坑位
		array[start] = temp
	}

	fmt.Println(array)
}

github地址