Python 冒泡排序

循环列表中的数字,两两比较,把大的放到后面

以下图为例:

第一轮比较

  • 第一次比较,先比较第一个和第二个,第二个比第一个小,不做交换

 

  • 第二次比较,再比较第二个和第三个,发现56比3大,所以把56放到后面

         

  • 第三次比较,再比较第三个和第四个,第三个还是比第四个大,那么交换顺序

           

  • 第四次比较,再比较第四个和第五个,发现第五个大,所以不做交换,至此最大值以确定

           

第二轮比较

  • 第一次比较,32比3大,交换位置

           

  • 第二次比较,32比24大,交换位置

            

  • 第三次比较,32比56小,不变。
  • 因为第一轮比较已经确定最后一个为最大数,所以第二轮比较次数要减掉已经比较的轮次

以此类推

代码

def bubbleSort(arr):
    # 先判断列表中的所有元素是不是都是int类型
    for n in arr:
        if isinstance(n, int):
            pass
        else:
            return False
    # 确定比较轮次
    for i in range(1,len(arr)):
        # 确定从0的位置开始比较,结束位置为总长减掉已比较的次数
        for j in range(0,len(arr)-i):
            # 第n个和n+1个比较,如果第一个比第二个大,则交换位置
            if arr[j] > arr [j+1]:
                arr[j], arr[j+1] = arr[j+1], arr[j]
    return arr

 

冒泡排序是一种简单的排序算法,它通过重复地遍历要排序的列表比较相邻的元素,并交换它们的位置来工作。这个过程会重复进行,直到没有需要交换的元素为止,这时列表就已经排序完成。 下面是一个Python 实现的冒泡排序算法示例代码: ```python def bubble_sort(arr): n = len(arr) for i in range(n): # 标志位,用于检测是否发生了交换 swapped = False for j in range(0, n-i-1): if arr[j] > arr[j+1]: # 交换元素 arr[j], arr[j+1] = arr[j+1], arr[j] swapped = True # 如果没有发生交换,说明列表已经有序,提前退出 if not swapped: break return arr # 示例使用 arr = [64, 34, 25, 12, 22, 11, 90] sorted_arr = bubble_sort(arr) print("排序后的:", sorted_arr) ``` 输出结果将会是: ``` 排序后的: [11, 12, 22, 25, 34, 64, 90] ``` 冒泡排序的基本步骤包括: - **比较相邻元素**:从列表的第一个元素开始,比较相邻的两个元素。 - **交换位置**:如果前一个元素比后一个元素大,则交换它们的位置。 - **重复遍历**:重复上述步骤,直到没有需要交换的元素为止。 - **优化**:通过设置标志位,可以在列表已经有序的情况下提前退出,减少不必要的比较冒泡排序的时间复杂度为: - 最坏情况:O(n²) —— 当列表是逆序的时候。 - 最好情况:O(n) —— 当列表已经有序的时候。 - 平均情况:O(n²) 冒泡排序的空间复杂度为 O(1),因为它是一种原地排序算法,不需要额外的存储空间。 此外,冒泡排序还可以通过递归的方式来实现。以下是递归实现冒泡排序一个例子: ```python def recursive_bubble_sort(arr, n=None): if n is None: n = len(arr) if n == 1: return arr for i in range(n - 1): if arr[i] > arr[i + 1]: # 交换元素 arr[i], arr[i + 1] = arr[i + 1], arr[i] return recursive_bubble_sort(arr, n - 1) # 测试 arr3 = [8, 3, 7, 4, 2, 9] print(recursive_bubble_sort(arr3)) # 输出:[2, 3, 4, 7, 8, 9] ``` 冒泡排序虽然简单,但在实际应用中效率较低,通常不适用于大数据量的排序任务。然而,对于教学目的或者小数据集,它仍然是一个很好的学习工具。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值