忙裏偷閒寫個冒泡排序。
原理:比較相鄰兩個的元素大小,將值大的元素放到右邊,值小的放在左邊。
方法:首先比較前兩個數,將小的數放在前面,將大數放在後面,然後是第2和第3個數,將小的放在前面,大數放在後面... 日復一日,直到比較到最後的兩個數,直到全部排序完成。
注意:最後一個數一定是數組中最大的一個數,所以在比較第二趟的時候,最後一個數是不參加比較的。
代碼
func main() {
arr := [...]int{79, 1, 90, 38, 76, 33, 17, 88}
sortArr4(arr[:])
fmt.Println("排序完成:", arr)
}
func sortArr4(arr []int) {
fmt.Println("傳入數組:", arr, "長度:", len(arr))
arrCount := len(arr) - 1
count, swapCount := 0, 0 //計算遍歷了多少次,發生數據交換多少次
for i := 1; i <= len(arr); i++ {
index := 0
fmt.Println("遍歷第", i, "趟:")
for j := 1; j <= arrCount; j++ {
count ++
if arr[j-1] > arr[j] {
arr[j], arr[j-1] = arr[j-1], arr[j]
swapCount ++
index = j - 1
fmt.Println("發生了交換,index=", index)
}
fmt.Println("\t\t遍歷第", j, "次:", arr)
}
arrCount = index
// 沒有位置變化說明無需再遍歷,有效減少遍歷和數據交換次數
if arrCount == 1 {
break
}
}
fmt.Println("共發生數據交換:", swapCount, "次. 共遍歷", count, "次。")
}
輸出如下
傳入數組: [79 1 90 38 76 33 17 88] 長度: 8
遍歷第 1 趟:
遍歷第 1 次: [1 79 90 38 76 33 17 88]
遍歷第 2 次: [1 79 90 38 76 33 17 88]
遍歷第 3 次: [1 79 38 90 76 33 17 88]
遍歷第 4 次: [1 79 38 76 90 33 17 88]
遍歷第 5 次: [1 79 38 76 33 90 17 88]
遍歷第 6 次: [1 79 38 76 33 17 90 88]
遍歷第 7 次: [1 79 38 76 33 17 88 90]
遍歷第 2 趟:
遍歷第 1 次: [1 79 38 76 33 17 88 90]
遍歷第 2 次: [1 38 79 76 33 17 88 90]
遍歷第 3 次: [1 38 76 79 33 17 88 90]
遍歷第 4 次: [1 38 76 33 79 17 88 90]
遍歷第 5 次: [1 38 76 33 17 79 88 90]
遍歷第 6 次: [1 38 76 33 17 79 88 90]
遍歷第 3 趟:
遍歷第 1 次: [1 38 76 33 17 79 88 90]
遍歷第 2 次: [1 38 76 33 17 79 88 90]
遍歷第 3 次: [1 38 33 76 17 79 88 90]
遍歷第 4 次: [1 38 33 17 76 79 88 90]
遍歷第 4 趟:
遍歷第 1 次: [1 38 33 17 76 79 88 90]
遍歷第 2 次: [1 33 38 17 76 79 88 90]
遍歷第 3 次: [1 33 17 38 76 79 88 90]
遍歷第 5 趟:
遍歷第 1 次: [1 33 17 38 76 79 88 90]
遍歷第 2 次: [1 17 33 38 76 79 88 90]
共發生數據交換: 15 次. 共遍歷 22 次。
排序完成: [1 17 33 38 76 79 88 90]
黃昏時偷來你的肋骨釀酒 百年後醉得有血有肉