已知有一个排序好的升序数组,要求插入一个元素,最后打印该数组,顺序依然是升序(数组不可以动态增长)
package main
import "fmt"
func appendArr(arr *[5]int, num int) [6]int {
//数组不能动态增长 新声明原数组len+1
var newArr [len(arr) + 1]int
var appendStatus bool = false //追加状态
//使用已知的有序数组 进行循环
for i := 0; i < len(arr); i++ {
if appendStatus {
//为真说明插入过值 以后的下标+1
newArr[i+1] = arr[i]
} else if num <= arr[i] && !appendStatus {
//如果当前下标值 大于输入值 并且未插入数据 符合升序插入
newArr[i] = num
//当前下标值还未插入新数组内
newArr[i+1] = arr[i]
appendStatus = true
} else {
//顺序码放
newArr[i] = arr[i]
}
}
//如果为false 说明循环内 不符合直接追加末尾
if !appendStatus {
newArr[len(arr)] = num
}
return newArr
/*
例插入 33 代码执行过程
有序数组[20, 30, 40, 50, 60]
newArr 比原有序数组长度大1,因为要插入一个元素
appendStatus 初始化为false 默认无插入
for循环,按照数组内元素 从0下标 顺序执行
代码执行过程
i=0第一次循环 arr[0] = 20
进入if判断
(appendStatus = false) 不成立
(num <= arr[i] && !appendStatus )33 不小于等于 20 并且 appendStatus取反为真 不成立
进入else 区间 顺序码放
newArr[i] = arr[i] 数据结构 newArr[0] = 20
第一次循环结果
newArr[20,0,0,0,0,0]
i=1第二次循环 arr[1] = 30
进入if判断
(appendStatus = false) 不成立
(num <= arr[i] && !appendStatus )33 不小于等于 30 并且 appendStatus取反为真 不成立
进入else 区间 顺序码放
newArr[i] = arr[i] 数据结构 newArr[1] = 30
第二次循环结果
newArr[20,30,0,0,0,0]
i=2第三次循环 arr[2] = 40
进入if判断
(appendStatus = false) 不成立
(num <= arr[i] && !appendStatus )33 小于等于 40 并且 appendStatus取反为真 成立
newArr[i] = num 数据结构 newArr[2] = 33
newArr[i+1] = arr[i] 数据结构 newArr[3] = 40
appendStatus = true //告知下次循环 数据已插入 下标增长1
有条件满足则不进入else 区间
第三次循环结果
newArr[20,30,33,40,0,0]
i=3第四次循环 arr[3] = 50
进入if判断
(appendStatus = true) 成立
newArr[i+1] = arr[i] 数据结构 newArr[4] = 50
(num <= arr[i] && !appendStatus )33 小于等于 40 并且 appendStatus取反为假 不成立
有条件满足则不进入else 区间
第三次循环结果
newArr[20,30,33,40,50,0]
i=4第五次循环 arr[4] = 60
进入if判断
(appendStatus = true) 成立
newArr[i+1] = arr[i] 数据结构 newArr[5] = 60
(num <= arr[i] && !appendStatus )33 小于等于 40 并且 appendStatus取反为假 不成立
有条件满足则不进入else 区间
第三次循环结果
newArr[20,30,33,40,50,60]
当num >= 60时 num大于数组所有元素 第二个条件不会成立
appendStatus不会为true 所以这个判断得知 num <= arr[i] 没有一个元素符合
直接追加到末尾
if !appendStatus {
newArr[len(arr)] = num
}
循环结束 return [20,30,33,40,50,60]
*/
}
func main() {
//已知一个有序数组,要求插入一个元素, 最后打印该数组顺序依然是升序
var sortArr [5]int = [5]int{20, 30, 40, 50, 60}
var num int
fmt.Println("请输入插入元素值:")
fmt.Scan(&num)
newArr := appendArr(&sortArr, num)
fmt.Println(newArr)
}