冒泡排序是一种基础的排序算法,由于是将元素向末尾移动,立起来看就像是泡泡从底部冒到顶端一样,故取名叫冒泡排序。
时间复杂度
最好情况:不需要排序,只需要遍历一次,故为O(N);最坏情况:每一轮都需要最多比较N次,需要比较N轮,所以为O(N^2),冒泡排序是一种稳定排序。
算法思想
元素两两比较,较大的元素往后一位移动,然后继续与后面的元素进行两两比较,直到一轮把最大的元素移动到数组末尾,此时末尾元素已经是有序的了,有序的元素不再参与下一轮比较,然后继续按照之前的方法进行两两比较与交换,再将最大的元素往后移动,直到所有的元素都有序。注意,如果一轮中没有发生元素交换,则当前数组已经是有序的,则退出排序过程。
首先第一轮,从元素2开始,与前一个元素进行比较,元素5大,则交换2和5,然后再到元素7,与前一个元素5进行比较,元素7大,不交换,然后到元素6,与前一个元素7进行比较,元素7大,所以进行交换,再到元素1,与前一个元素7进行比较,元素7大,则交换1和7,再到元素4,与前一个元素7进行比较,元素7大,则交换4和7,再到最后一个元素3,与前一个元素7进行比较,元素7大,则交换3和7,此时第一轮将最大的元素7,冒泡到了顶部;
第二轮,还是从第二个元素5开始,与前一个元素进行2进行比较,元素5大,不交换,再到元素6,与前一个元素5进行比较,元素6大,不交换,再到元素1,与前一个元素6进行比较,元素6大,则交换元素1和6,再到元素4,与前一个元素6进行比较,元素6大,则交换4和6,再到元素3,与前一个元素6进行比较,元素6大,则交换3和6,此时这一轮将最大的元素6,冒泡到了顶部;
第三轮到第五轮同理,到第六轮,当比较完前三个元素后发现没有发生交换,则判定当前数组已经有序,此时退出排序过程。
代码实现
package main
import "fmt"
func bubble_sort(arr []int) {
if len(arr) <= 1 {
return
}
for i := len(arr) - 1; i >= 1; i-- {
flag := false
for j := 1; j <= i; j++ {
if arr[j] < arr[j-1] {
arr[j], arr[j-1] = arr[j-1], arr[j]
flag = true
}
}
if !flag {
break
}
fmt.Println(arr)
}
}
func main() {
arr := []int{5, 2, 7, 6, 1, 4, 3}
bubble_sort(arr)
fmt.Println(arr)
}
输出:
[2 5 6 1 4 3 7]
[2 5 1 4 3 6 7]
[2 1 4 3 5 6 7]
[1 2 3 4 5 6 7]
[1 2 3 4 5 6 7]
代码将每次排序的过程都打印出来,方便理解。