八大排序-冒泡排序(go实现 动图演示)

本文介绍了冒泡排序的原理,通过动图演示了排序过程。冒泡排序通过相邻元素对比并交换,确保最大(小)值逐步下沉。尽管其时间复杂度为O(n^2),但空间复杂度仅为O(1)。与选择排序相比,两者时间复杂度相同,但冒泡排序从后往前确定有序。此外,文章展示了Go语言的冒泡排序实现,并提出一种优化方案,即在无交换发生时提前结束排序。

一、动图演示

二、思路分析

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))
}

 输出:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值