一、动图演示
二、思路分析
1. 相邻两个数两两相比,n[i]跟n[j+1]比,如果n[i]>n[j+1],则将连个数进行交换,
2. j++, 重复以上步骤,第一趟结束后,最大数就会被确定在最后一位,这就是冒泡排序又称大(小)数沉底,
3. i++,重复以上步骤,直到i=n-1结束,排序完成。
三、负杂度分析
1. 不管原始数组是否有序,时间复杂度都是O(n2),
因为没一个数都要与其他数比较一次,(n-1)2次,分解:n2+2n-1, 去掉低次幂和常数,剩下n2,所以最后的时间复杂度是n2
2. 空间复杂度是O(1),因为只定义了一个辅助变量,与n的大小无关,所以空间复杂度为O(1)
四、 选择排序和冒泡排序的比较
1. 时间负责度都是O(n2)
2. 空间复杂度都是O(1)
3. 选择排序是从第一位开始确定最大或最小的数,保证前面的数都是有序的,且都比后面的数小或大,
冒泡排序是从最后一位开始确定最大或最小的数,保证后面的数都是有序的且都大于或小于前面的数。
五、go代码实现
//八大排序
//1.冒泡排序 n^2
func Swap(arr []int,i,j int){
arr[i],arr[j]=arr[j],arr[i]
}
func MaoPaoSort(arr []int)[]int{
for i := 0; i < len(arr); i++ {
for j := 1; j <len(arr)-i ; j++ {
if(arr[j]<arr[j-1]){
Swap(arr,j,j-1)
}
}
}
return arr
}
func main() {
arr:=[]int{3,6,4,8,2,5,4,1,5}
fmt.Println(algorithm.MaoPaoSort(arr))
}
输出:
六、冒泡的优化
func Swap(arr []int,i,j int){
arr[i],arr[j]=arr[j],arr[i]
}
//加入flag
func MaoPaoSort(arr []int)[]int{
for i := 0; i < len(arr); i++ {
fmt.Println("第",i,"次循环")
flag:=0
for j := 1; j <len(arr)-i ; j++ {
if(arr[j]<arr[j-1]){
Swap(arr,j,j-1)
flag=1
}
}
if flag==0{
break
}
}
return arr
}
func main() {
arr:=[]int{3,6,4,8,2,5,7,8,9}
fmt.Println(algorithm.MaoPaoSort(arr))
}
输出: