冒泡算法
冒泡排序(英语:Bubble Sort)是一种简单的排序算法。
之所以称之为冒泡是因为它有这样的动作。从第一个开始和相邻的做比较,如果大于相邻的点则交换,否则不作处理。这样子保证了大的那一个一般步步向上挪动,直到尾部这个过程就好像气泡向上冒一般所以称之为冒泡算法。
算法描述
比较相邻的元素。如果第一个比第二个大,就交换他们两个。
对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。这步做完后,最后的元素会是最大的数。
针对所有的元素重复以上的步骤,除了最后一个。
持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
算法实现
以下使用golang实现,并且使用的是slice,并不是数组。内部的构造共享,所以此时不需要返回新的arr。
注意点
- i 0 -> n-1 因为当n-1个有序的时候 整个数组其实已经有序了
- j < arrLen-1 保证 j + 1 最大为arrLen - 1 否则越界
/*
这里使用的是slice 内部的结构已经改变了 所以不需要return
数组的话需要return 因为函数是值拷贝
注意第二层循环的范围是 0 -> arrLen-i-1 初始的时候 i = 0
则 j < arrLen - 1 保证 j + 1 最大为arrLen - 1 否则越界
*/
func BubbleSort(arr []int) {
arrLen := len(arr)
for i := 0; i < arrLen-1; i++ { // 冒泡的次数 n-1次冒泡
for j := 0; j < arrLen-i-1; j++ { //要比较的范围 从 0 -> arrLen - i - 1 随着 i增大 尾部逐渐有序 冒泡
if arr[j] > arr[j+1] {
arr[j], arr[j+1] = arr[j+1], arr[j]
}
}
}
}
测试
使用golang自带的测试方法
func TestBubbleSort(t *testing.T) {
arr := []int{2,3,1,9,7,6,5}
fmt.Printf("before Bubble Sort: %+v \n", arr)
BubbleSort(arr)
fmt.Printf("after Bubble Sort:%+v \n", arr)
}
打印结果
before Bubble Sort: [2 3 1 9 7 6 5]
after Bubble Sort:[1 2 3 5 6 7 9]