go 已知有个排序(升序)的数组,要求插入一个元素,最后打印该数组,顺序依然是升序

// 任意位置插入数字类型的元素
// @param slice []int 将指定元素插入的切片
// @param num int 插入的指定元素
// @param index int 插入的指定位置
func arbitrarilyInsertElement(slice []int, num int, index int) []int {
	slice = append(slice[:index], append([]int{num}, 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]int{1, 3, 5, 7, 9} // 升序数组
	num := 5                     // 要插入的值
	exec2(arr, 0, len(arr)-1, num)
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

码小余の博客

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值