指標和切片方式氣泡排序
阿新 • • 發佈:2020-08-09
網上形象介紹氣泡排序的過程的資料也很多,其主要思想就是輪排序一定會使得最大的數排到整個陣列末尾;
一共n-1輪外層排序,或者理解為只剩1個數時不需要排序;
對於第 i 輪外層排序,已經有 i 個數排到末尾,此時需要對 n-i 個數進行排序,但還是隻剩1個數不需要排序,因此需要排 n-i-1 次;
這裡用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個值:\n",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) }