NOTE
3.9 冒泡排序
1. 冒泡排序 有序的数组是不存在逆序对的,非有序的则存在逆序对,只需要把逆序对交换一下即可 - 多趟扫描 - 每趟相邻项比较,如果是逆序对那么交换位置 2. 特点 - 稳定性:稳定 - 时间复杂度:O(n²) - 空间复杂度:O(1) 3. 实现 3.1. 测试 4. 优化 - 如果某一趟中没有一
这是历史学习笔记,可能存在过时或不完整的理解。
1. 冒泡排序
有序的数组是不存在逆序对的,非有序的则存在逆序对,只需要把逆序对交换一下即可
- 多趟扫描
- 每趟相邻项比较,如果是逆序对那么交换位置
2. 特点
- 稳定性:稳定
- 时间复杂度:O(n²)
- 空间复杂度:O(1)
3. 实现
//O(N²)
func BubbleSort(data []model.Comparable) {
for i := 0; i < len(data); i++ {
for j := 0; j < len(data)-i-1; j++ {
if data[j].CompareTo(data[j+1])>0 {
util.Swap(data, j, j+1)
}
}
}
}
3.1. 测试
func TestBubbleSort(t *testing.T) {
e0 := model.NewElement(0)
e1 := model.NewElement(1)
e2 := model.NewElement(2)
e3 := model.NewElement(3)
e4 := model.NewElement(4)
data := []model.Comparable{e2, e1, e3, e0, e4}
fmt.Println(data)
BubbleSort(data)
fmt.Println(data)
}
4. 优化
- 如果某一趟中没有一次交换,那么说明已经有序了,直接退出
func BubbleSort2(data []model.Comparable) {
for i := 0; i < len(data); i++ {
ordered := true
for j := 0; j < len(data)-i-1; j++ {
if data[j].CompareTo(data[j+1]) > 0 {
ordered = false
util.Swap(data, j, j+1)
}
}
if ordered {
break
}
}
}