Go語言之簡單算法的實現——插入排序算法
1、直接插入排序算法
1.1 直接插入排序升序算法(以空間節省時間)
- 普通查找方式
/**
* 直接插入排序升序算法(以空間節省時間)
* 優點: 實現簡單,新建切片存儲排序後結果,能節省數組元素移動的時間
* 缺點: 增大空間開銷
* 空間複雜度: O(2n)
* 時間複雜度: O(n^2)
* Author: ncuwen
*/
func DirectInsertionSort1(point []float32) []float32 {
var result = make([]float32, 0, len(point))
for _, v := range point {
reSize := len(result)
index := 0
for j := reSize - 1; j >= 0; j-- {
if v > result[j] {
index = j + 1
break
}
}
temp := append([]float32{}, result[index:]...)
result = append(result[:index], v)
result = append(result, temp...)
}
return result
}
- 二分查找方式
/**
* 二分插入排序升序算法(以空間節省時間)
* 優點: 實現簡單,新建切片存儲排序後結果,能節省數組元素移動的時間,並且使用二分遞歸查找方式尋找插入位置,節省空間
* 缺點: 增大空間開銷
* 空間複雜度: O(2n)
* 時間複雜度: O(n^2)
* Author: ncuwen
*/
func BinaryInsertionSort(point []float32) []float32 {
var result = make([]float32, 0, len(point))
for _, v := range point {
index := BinarySearchFirstGreaterByRecursive(result, v)
temp := append([]float32{}, result[index:]...)
result = append(result[:index], v)
result = append(result, temp...)
}
return result
}
tips: 二分查找算法見 Go語言之簡單算法的實現——查找算法
1.2 直接插入排序升序算法(以時間節省空間)
/**
* 直接插入排序升序算法(以時間節省空間)
* 優點: 實現簡單, 直接在原切片上進行處理,能節省空間
* 缺點: 增大時間開銷,需要移動元素
* 空間複雜度: O(n)
* 時間複雜度: O(n^2)
* Author: ncuwen
*/
func DirectInsertionSort2(point []float32) {
var j = 0
for i := 1; i < len(point); i++ {
tmp := point[i]
for j = i; j > 0 && tmp < point[j-1]; j-- {
point[j] = point[j-1]
}
point[j] = tmp
}
}
[Github源碼地址] : https://github.com/NcuWen/Arithmetic