开发者学堂课程【Go 语言核心编程 - 数据结构和算法:数据结构和算法-插入排序实现】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/627/detail/9850
数据结构和算法-插入排序实现
考察代码算法怎么样是最基本的,现在就根据之前讲的做一下
接下来就是新建文件夹,还是用之前的数据。
package main
import(
"fmt"
)
func Insertsort (arr"[5]int){
//完成第一次,给第二个元素找到合适的位置并插入
insertval:=arr[1]]
insertIndex :=1-1 //下标
//从大到小,就是要做一个后移的动作,就是把23往后移动,也很简单
for insertIndex >=0 && arr[ InsertIndex ]<insertval{
Arr [insertIndex+1]=arr[insertIndex]
//数据后移,要注意 insertIndex 先不动,后边的值等于前边的值就相当于把它覆盖了,不用担心,因为 insertval 已经被保存下来了。
insertIndex--
}
//插入
If insertIndex+1!=1{
Arr[ insertIndex+1]=insertval
}
Fmt.println(“第一次插入后的结果”)
}
func main(){
arr:=[5]int{23,e, 12, 56, 34}
Fmt.println(“原始数组=”,arr)
Insert&sort(&arr)
Fmt.println(“main 函数”)
Fmt.println(arr)
}
发现代码是正确的,0本身就是这个位置,它就在原来的位置没有动,但是不遍历是不知道的,所以还需要比较一次,比较完了,相当于这个是效率最高的,刚好是最后,比一次就可以了。
//完成第二次,给第三个元素找到合适的位置并插入
insertval=arr[2]
insertIndex =2-1 //下标
//从大到小,就是要做一个后移的动作,就是把23往后移动,也很简单
for insertIndex >=0 && arr[ InsertIndex ]<insertval{
Arr [insertIndex+1]=arr[insertIndex]
//数据后移,要注意
insertIndex 先不动,后边的值等于前边的值就相当于把它覆盖了,不用担心,因为 insertval 已经被保存下来了。
insertIndex--
}
//插入
If insertIndex+1!=2{
Arr[ insertIndex+1]=insertval
}
Fmt.println(“第二次插入后的结果”)
}
第二次运行是正确的
//完成第三次,给第四个元素找到合适的位置并插入
insertval=arr[3]
insertIndex =3-1
//下标
//从大到小,就是要做一个后移的动作,就是把23往后移动,也很简单
for insertIndex >=0 && arr[ InsertIndex ]<insertval{
Arr [insertIndex+1]=arr[insertIndex]
//数据后移,要注意 insertIndex 先不动,后边的值等于前边的值就相当于把它覆盖了,不用担心,因为 insertval 已经被保存下来了。
insertIndex--
}
//插入
If insertIndex+1!=3{
Arr[ insertIndex+1]=insertval
}
Fmt.println(“第三次插入后的结果”)
}
第三次运行也是正确的,56最大就到前边去了,其余都向后移。
//完成第四次,给第五个元素找到合适的位置并插入
insertval=arr[4]
insertIndex =4-1
//下标
//从大到小,就是要做一个后移的动作,就是把23往后移动,也很简单
for insertIndex >=0 && arr[ InsertIndex ]<insertval{
Arr [insertIndex+1]=arr[insertIndex]
//数据后移,要注意 insertIndex 先不动,后边的值等于前边的值就相当于把它覆盖了,不用担心,因为 insertval 已经被保存下来了。
insertIndex--
}
//插入
If insertIndex+1!=4{
Arr[ insertIndex+1]=insertval
}
Fmt.println(“第四次插入后的结果”)
}
第四次也正确
五个元素四次,这四次是差不多一样的,只有一点地方不一样。
整合的代码:
//完成第一次,给第二个元素找到合适的位置并插入
for i:=1;ic len(arr);i++{
insertVal:=arr[i]
insertIndex :=1-i
//下标
//从大到小
for insertndex >=0&ərr[ 1nsertndex ]<1nsertVal{
arr[ 1nsertIndex +1]=arri[ insertTndex ]
//数据后移
insertxndex --
//插入
if insertlndex+1!=i{
arr[ insertndex +1]=insertval
}
fmt, Print1n("第%d次插入后%v\n",*arr)
}
代码结果是正确的,添加两个数也是没有问题的。
每次只要改变 i 的值即可。
思路:
第一次,先找到第一个元素,insertval 这是个下标,是插入的,下标总是元素的前一个值,然后进行一个从大到小的排序,只要 insertIndex >=0 就可以一直找,
因为要防止一直找不到就到最前面去了,要插入的值比之前的值大才到最前边,说明应该继续往前走,走的时候要后移,后移的时候就是移动一下,后移之后 insertval 再移一下,因为要看前面有没有更合适的,等到整个循环遍历结束后,就说明这个值的位置找到了,
位置就应该是 insertIndex +1,插入的值就应该是 insertIndex +1这个下标,但是为了提高效率,要考虑 insertIndex +1到底有没有可能就是最后一个,就比如0,比较发现23就大,那这个位置就找到了,找到之后就没有必要自己再加注一次了,所以排除一下这个条件。