网上形象介绍冒泡排序的过程的资料也很多,其主要思想就是轮排序一定会使得最大的数排到整个数组末尾;
一共n-1轮外层排序,或者理解为只剩1个数时不需要排序;
对于第 i 轮外层排序,已经有 i-1 个数排到末尾,此时需要对 n-(i-1) 个数进行排序,但还是只剩1个数不需要排序,因此需要排 n-(i-1)-1=n-i 次;
这里用2种方式分别实现,一种是用指针对事先安排好的数组排序,一种对在终端输入数组的排序,但本质上都是对数组的引用(因为数组在golang中是值类型),只是切片形式上更灵活;
-
指针
package main import ( "fmt" ) func bubble(arr *[5]int64) { fmt.Println("排序前:",*arr) var temp int64 for i := 0; i < len(*arr)-1; i++ { for j := 0; j < len(*arr)-i-1; j++ { // 用指向数组的指针取值写成(*arr)的形式 if (*arr)[j] > (*arr)[j+1] { temp = (*arr)[j] (*arr)[j] = (*arr)[j+1] (*arr)[j+1] = temp } } } fmt.Println("排序后:",*arr) } func main() { arr := [5]int64{55,33,66,22,11} bubble(&arr) }
-
切片
package main import ( "fmt" ) func bubble(n int) { bubbleArr := make([]int, n) // 终端输入生成切片 for i := 0; i < n; i++ { fmt.Printf("请输入第%d个值: ",i+1) fmt.Scanln(&bubbleArr[i]) } fmt.Println("排序前:",bubbleArr) // 排序 for j := 1; j < n; j++ { for k := 0; k < n-j; k++ { var temp int if bubbleArr[k] >= bubbleArr[k+1] { temp = bubbleArr[k] bubbleArr[k] = bubbleArr[k+1] bubbleArr[k+1] = temp } } } fmt.Println("排序后:",bubbleArr) } func main() { var n int fmt.Println("请输入数组长度:") fmt.Scanln(&n) bubble(n) }