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元
225 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

197

社区成员

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

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

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

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