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 已知有个排序(升序)的数组,要求插入一个元素,最后打印该数组,顺序依然是升序的主要内容,如果未能解决你的问题,请参考以下文章

Go-插入排序

经典排序之插入排序

[GO]冒泡排序的原理和代码实现

Java数组问题<现在有一组无序字符序列: a、c、u、b、e、p、f、z.按字母顺序进行升序排列。

选择排序,插入排序以及希尔排序

插入排序,希尔排序,堆排序