197
社区成员
发帖
与我相关
我的任务
分享
冒泡排序算是大家学习算法的入门第一课了,很好理解,类似湖面看到的水泡,因为体积轻,然后就慢慢往上浮上来
比如数组[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