package main
import "fmt"
// 冒泡排序:第一个元素和第二个元素比较值大小,如果第一个元素大于第二个元素则交换位置否则不交换,然后第二个元素与第三个元素比较大小,依次论推
// 思路:
// 1. 如果第一个元素大于第二个元素,交换位置
// 2. 对数组进行一次完整交换
// 3. 对数组进行多次完整交换
// 特征: 每完成一次遍历交换,要么将最小或者将最大放到最后,类似鱼吐泡泡,所以称为冒泡排序
// 支持排序的对象:
// 1. 所以元素类型相同,并支持可比较
// 2. 元素位置有顺序
// 3. 元素支持交换位置
// 排序思维: 事情的重要性、操作流程
func bubble(nums []int) {
// j 需要经历的循环次数
for j := 0; j < len(nums)-1; j++ {
// hasExchanged 优化方案,如果一次交换都没发送则认为是已经排好序的
hasExchanged := false
for i := 0; i < len(nums)-1-j; i++ {
// 交换
if nums[i] > nums[i+1] {
nums[i], nums[i+1] = nums[i+1], nums[i]
hasExchanged = true
}
}
if !hasExchanged {
break
}
}
}
func main() {
data := []int{22, 33, 11, 23, 55, 4, 33, 45, 23}
bubble(data)
fmt.Println(data) // [4 11 22 23 23 33 33 45 55] 升序
}