基础算法-----冒泡排序(Bubble Sort)

算法稳定性,时间复杂度,空间复杂度等算法基础知识经典算法----基础知识
冒泡排序基础算法----冒泡排序
选择排序基础算法----选择排序
插入排序基础算法----插入排序
快速排序基础算法----快速排序
希尔排序基础算法----希尔排序
归并排序基础算法----归并排序
计数排序基础算法----计数排序
桶排序基础算法----桶排序
基数排序基础算法----基数排序
堆排序基础算法----堆排序

一 算法简介

冒泡排序会依次比较两个相邻的元素, 如果顺序错误则交换位置, 重复此过程直到没有相邻元素需要交换

冒泡排序的效率较低,冒泡排序是一种简单的排序算法,适用于小规模数据排序

二 时间复杂度,空间复杂度

一) 时间复杂度

循环次数
最好情况(与期望顺序相同)/最坏情况(与期望顺序相反)的循环次数(比较次数)都一样:
T(n) = (n-1) + (n-2) + (n-3) + … + 1
  = n(n-1)/2


位置交换次数
最好情况: 0次交换
最坏情况: n(n-1)/2


平均时间复杂度为T(n) = O(n2)

二) 空间复杂度

冒泡排序不需要额外的空间,所以空间复杂度为 S(n) = O(1)

三 算法稳定性

相邻的两个元素比较,顺序错误则交换位置,如果相邻的两个元素相等,不会交换位置
如果两个相等的元素没有相邻,那么即使通过交换把两个元素相邻起来,也不会交换位置

排序完成后相同元素的前后顺序没有改变,冒泡排序是一种稳定的排序算法

四 实现

一) 排序过程

使用{50, 40, 30, 20, 10}演示从小到大的排序过程

其中
图示说明


第一趟
           冒泡排序----第一趟


第二趟
[冒泡排序----第二趟]


第三趟
[冒泡排序----第三趟]


第四趟
[冒泡排序----第四趟]

二) 基于golang代码实现

1 基础版

外层循环表示比较的趟数,内层循环表示对每一趟中未排好序的元素进行排序

每一趟确定一个最值(最大值/最小值)

func BubbleSort(arr []int) {

	if len(arr) <= 1 {
		return
	}

	for i := 0; i < len(arr)-1; i++ {
		for j := 0; j < len(arr)-1-i; j++ {
			if arr[j] > arr[j+1] {
				arr[j], arr[j+1] = arr[j+1], arr[j]
			}
		}
	}

	return
}

2 优化版

基于基础版的优化:如果经过前面几趟的排序后已经与期望顺序相同,那后面的几趟排序就不需要执行了

每一趟排序开始将一个标志设置为false,在这趟排序中,如果发生了数据交换,将该标志设置为true;如果没发生数据交换,则依然为false
当每一趟排序结束,检查该标志的值,如果没发生数据交换,说明此时的顺序与期望顺序相同, 退出

func BubbleSort(arr []int) {

	if len(arr) <= 1 {
		return
	}

	for i := 0; i < len(arr)-1; i++ {
		swapBool := false
		for j := 0; j < len(arr)-1-i; j++ {
			if arr[j] > arr[j+1] {
				arr[j], arr[j+1] = arr[j+1], arr[j]
				swapBool = true
			}
		}
		if !swapBool {
			break
		}
	}

	return
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值