忙裏偷閒寫個冒泡排序。

忙裏偷閒寫個冒泡排序。

原理:比較相鄰兩個的元素大小,將值大的元素放到右邊,值小的放在左邊。

方法:首先比較前兩個數,將小的數放在前面,將大數放在後面,然後是第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]

 

黃昏時偷來你的肋骨釀酒  百年後醉得有血有肉

 

發佈了170 篇原創文章 · 獲贊 109 · 訪問量 8萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章