Go语言的冒泡排序(附:深拷贝与浅拷贝)

寅恪光潜
深度学习领域优质创作者
博客专家认证
2022-12-16 09:33:53

冒泡排序算是大家学习算法的入门第一课了,很好理解,类似湖面看到的水泡,因为体积轻,然后就慢慢往上浮上来

比如数组[33, 8, 12, 7, 6],我们在第一轮比较之后,会发现最大数沉底了,到了最后,第二轮比较之后,第二大的数字也沉到倒数第二的位置了,相反的小的就慢慢的浮上来了。

[8 12 7 6 33]

[8 7 6 12 33]

[7 6 8 12 33]

[6 7 8 12 33]

 5个数字经过4轮之后,排序就做好了,那代码就很简单了,两个for循环,外循环就是0到4,内循环就是随着每一轮递减一次循环即可,因为每一轮已经将大的数字放到后面了,就不需要再次比较了。

代码:

package main

import "fmt"

func bubbleSort(arr []int) []int {
	len := len(arr) - 1
	for i := 0; i < len; i++ {
		for j := 0; j < len-i; j++ {
			//如果比相邻的大就交换位置
			if arr[j] > arr[j+1] {
				arr[j], arr[j+1] = arr[j+1], arr[j]
			}
		}
	}
	return arr
}

func main() {
	arr1 := []int{33, 8, 12, 7, 6}
	arr2 := make([]int, len(arr1))
	copy(arr2, arr1)
	arr3 := bubbleSort(arr2)
	fmt.Printf("%v=>%v\n", arr1, arr3) //[33 8 12 7 6]=>[6 7 8 12 33]
	fmt.Printf("%p,%p", arr1, arr3)    //0xc00000e3f0,0xc00000e420
}

另外为了更清晰的表示前后数组(切片)的变化,使用了copy深拷贝,这种拷贝可以拷贝里面的值,如果是arr2:=arr1这样的赋值,是一种浅拷贝,也就是说拷贝的是引用,是一个地址,共享同一地址,这样你修改了arr1也会修改arr2

...全文
成就一亿技术人!
拼手气红包 5.00元
371 回复 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

198

社区成员

发帖
与我相关
我的任务
社区描述
从零开始的小白到进阶成技术达人。 一起学习,一起进步。
golanggo1.19 个人社区 贵州省·贵阳市
社区管理员
  • 寅恪光潜
  • 网络豆
  • Somnus_小凯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

Go语言集各语言优势之大成,从基础到进阶

一起学习,一起进步,成为技术达人!

试试用AI创作助手写篇文章吧