Go語言之簡單算法的實現——插入排序算法

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章