排序算法(1):冒泡排序

问题

排序 [30, 24, 5, 58, 18, 36, 12, 42, 39]

冒泡排序

冒泡排序通过多次遍历待排序列表,每次比较相邻两个元素,如果顺序错误就将它们交换过来,重复进行直到没有需要交换的元素,排序完成。

图解

  1. 第一轮排序:遍历全部元素,依次比较相邻元素,直到将最大的元素交换到最后一位。

  2. 第二轮排序,遍历待排序元素,依次比较相邻元素,将最大的元素交换到待排序列表的最后一位。

  3. 继续遍历直到所有元素被交换到正确位置时结束。

代码

py 复制代码
def bubble_sort(nums):
    n = len(nums)

    for i in range(n -1):	# 外循环
        for j in range(n-1-i):		# 内循环
            if nums[j] > nums[j+1]:		# 顺序错误时交换
                nums[j], nums[j+1] = nums[j+1], nums[j]		

    return nums

时间复杂度

冒泡排序的时间复杂度为 O(n2)

算法优化

增加一个标志位 flag,若在某轮内循环中没有进行任何交换操作,表示数组已经完成排序,可以直接返回结果。

py 复制代码
def bubble_sort(nums):
    n = len(nums)

    for i in range(n -1):	# 外循环
    	flag = False
        for j in range(n-1-i):		# 内循环
            if nums[j] > nums[j+1]:		# 顺序错误时交换
                nums[j], nums[j+1] = nums[j+1], nums[j]	
                flag = True	
		if not flag: break
		
    return nums
相关推荐
im_AMBER2 小时前
Leetcode 74 K 和数对的最大数目
数据结构·笔记·学习·算法·leetcode
t198751283 小时前
电力系统经典节点系统潮流计算MATLAB实现
人工智能·算法·matlab
断剑zou天涯3 小时前
【算法笔记】蓄水池算法
笔记·算法
长安er3 小时前
LeetCode 206/92/25 链表翻转问题-“盒子-标签-纸条模型”
java·数据结构·算法·leetcode·链表·链表翻转
唯道行4 小时前
计算机图形学·23 Weiler-Athenton多边形裁剪算法
算法·计算机视觉·几何学·计算机图形学·opengl
CoderYanger4 小时前
动态规划算法-01背包问题:50.分割等和子集
java·算法·leetcode·动态规划·1024程序员节
花月C4 小时前
个性化推荐:基于用户的协同过滤算法
开发语言·后端·算法·近邻算法
lxh01134 小时前
最长递增子序列
前端·数据结构·算法
Youyzq5 小时前
前端项目发布到cdn上css被编译失效问题rgba失效和rgb失效
前端·css·算法·cdn
风筝在晴天搁浅5 小时前
代码随想录 516.最长回文子序列
算法