go 已知有个排序(升序)的数组,要求插入一个元素,最后打印该数组,顺序依然是升序
Posted 码小余の博客
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了go 已知有个排序(升序)的数组,要求插入一个元素,最后打印该数组,顺序依然是升序相关的知识,希望对你有一定的参考价值。
// 任意位置插入数字类型的元素
// @param slice []int 将指定元素插入的切片
// @param num int 插入的指定元素
// @param index int 插入的指定位置
func arbitrarilyInsertElement(slice []int, num int, index int) []int
slice = append(slice[:index], append([]intnum, slice[index:]...)...)
return slice
// 2、已知有个排序(升序)的数组,要求插入一个元素,最后打印该数组,顺序依然是升序
// @params arr [5]int 升序数组
// @params leftIndex int 左值索引
// @params rightIndex int 右值索引
// @params num int 要插入的值
// @return bool
func exec2(arr [5]int, leftIndex int, rightIndex int, num int) bool
slice := arr[:] // 将数组转成切片后才能新增元素
// 因为数组是升序的,所以可以使用二分查找来做exec2
middleIndex := (leftIndex + rightIndex) / 2 // 中间值的索引
middle := slice[middleIndex] // 中间值
if leftIndex > rightIndex
// 防止右值索引小于0
if rightIndex < 0
rightIndex = 0
if num > arr[rightIndex]
// num在中间值右侧,左值索引向右移动(+1),右值索引不变,所以使用rightIndex
// 因为左值索引向右移动了,所以当前左值索引(leftIndex)就是需要将num插入的位置
slice = arbitrarilyInsertElement(slice, num, leftIndex)
else if num < arr[leftIndex]
// num在中间值左侧,右值索引向左移动(-1),左值索引不变,所以使用leftIndex
// 因为右值索引向左移动了,所以当前右值索引(rightIndex)就是需要将num插入的位置
slice = arbitrarilyInsertElement(slice, num, rightIndex)
fmt.Println("slice=", slice)
return false
if num < middle
rightIndex = middleIndex - 1
else if num > middle
leftIndex = middleIndex + 1
else if num == middle
// num等于中间值,所以可以直接使用中间值索引(middleIndex)作为将num插入的位置
slice = arbitrarilyInsertElement(slice, num, middleIndex)
fmt.Println("slice=", slice)
return true
return exec2(arr, leftIndex, rightIndex, num)
func main()
arr := [5]int1, 3, 5, 7, 9 // 升序数组
num := 5 // 要插入的值
exec2(arr, 0, len(arr)-1, num)
以上是关于go 已知有个排序(升序)的数组,要求插入一个元素,最后打印该数组,顺序依然是升序的主要内容,如果未能解决你的问题,请参考以下文章