轻松掌握冒泡排序:Python冒泡排序算法

冒泡排序通常是程序员面试中经常被考察的八大排序算法之一。

初级开发岗位的面试基本上都被会问到,原因:

  1. 冒泡排序是一种基本排序算法,是入门级别的排序算法之一,容易理解和实现。

  2. 冒泡排序的时间复杂度为 O(n^2),性能不是最优的,但在某些情况下可能仍然是最佳选择。

  3. 冒泡排序涉及到数组的操作,可以考察被面试者对数组和循环的理解和应用。

今天我们一起学习、复习下关于冒泡排序的知识。

什么是冒泡排序

冒泡排序是一种基本的排序算法,它通过反复交换相邻两个元素的位置,使得每一轮循环都能将未排序部分中的最大元素移动到数组的末尾。

因为排序过程中较小的元素像气泡一样逐渐浮到数组的顶部,故称为冒泡排序。

冒泡排序的基本思路

从数组的第一个元素开始,依次比较相邻两个元素的大小,如果前面的元素比后面的元素大,就交换它们的位置,这样一轮比较下来,最大的元素就被交换到了数组的最后一个位置。

接下来,重复这个过程,直到所有元素都被排序为止。

用Python实现冒泡排序

def bubble_sort(arr):
    """
    冒泡排序函数,将输入的数组 arr 排序后返回
    """
    n = len(arr)
    # 遍历整个数组
    for i in range(n):
        # 每次遍历只处理未排序的部分
        for j in range(0, n-i-1):
            # 如果前一个元素比后一个元素大,则交换它们的位置
            if arr[j] > arr[j+1]:
                arr[j], arr[j+1] = arr[j+1], arr[j]
    return arr
  • 在函数内部,首先获取数组的长度 n,然后通过两个循环嵌套实现冒泡排序。外层循环用来遍历整个数组,内层循环则用来处理未排序的部分。

  • 在内层循环中,首先使用 range(0, n-i-1) 来遍历未排序部分的每个元素对,比较相邻两个元素的大小,如果前一个元素比后一个元素大,则交换它们的位置。这样,每一轮遍历就会将未排序部分中的最大元素交换到数组的末尾。

  • 每一轮遍历都会将未排序部分的最大元素交换到数组的末尾,因此在下一轮遍历时就可以忽略已经排序的部分。当内层循环结束时,数组已经被排好序了。

测试排序代码:

import random 

# 随机生成100个1~100之间的整数值
random_arr = [random.randint(1,100) for n in range(100)]

def bubble_sort(arr):
    """
    冒泡排序函数,将输入的数组 arr 排序后返回
    """
    n = len(arr)
    # 遍历整个数组
    for i in range(n):
        # 每次遍历只处理未排序的部分
        for j in range(0, n-i-1):
            # 如果前一个元素比后一个元素大,则交换它们的位置
            if arr[j] > arr[j+1]:
                arr[j], arr[j+1] = arr[j+1], arr[j]
    return arr

if __name__ == "__main__":
    print(bubble_sort(random_arr))

输出结果:

[1, 1, 2, 2, 2, 3, 5, 6, 6, 7, 10, 10, 12, 14, 17, 19, 21, 22, 22, 23, 24, 24, 24, 25, 25, 26, 28, 28, 30, 30, 33, 33, 34, 35, 35, 36, 37, 37, 37, 37, 39, 40, 42, 43, 45, 45, 46, 48, 50, 50, 50, 51, 51, 53, 54, 56, 56, 57, 57, 58, 59, 59, 61, 61, 63, 64, 64, 65, 65, 66, 67, 69, 70, 71, 71, 75, 77, 78, 83, 83, 83, 84, 85, 85, 87, 89, 90, 90, 91, 91, 91, 93, 93, 93, 94, 96, 96, 99, 100, 100]   

如果对于排序的过程还是有点抽象,那么请运行以下代码,来感受下冒泡排序的整个过程:

import time
import pygame
import random

# 初始化 Pygame
pygame.init()

# 设置窗口的大小和标题
WINDOW_WIDTH = 800
WINDOW_HEIGHT = 600
WINDOW_TITLE = 'Bubble Sort Visualization'
WINDOW = pygame.display.set_mode((WINDOW_WIDTH, WINDOW_HEIGHT))
pygame.display.set_caption(WINDOW_TITLE)

# 设置颜色常量
WHITE = (255, 255, 255)
BLACK = (0, 0, 0)
RED = (255, 0, 0)
GREEN = (0, 255, 0)
BLUE = (0, 0, 255)

# 设置方块的大小和间隔
BLOCK_SIZE = 10
BLOCK_SPACING = 5

# 创建随机数组
arr = [
    random.randint(1, WINDOW_HEIGHT - BLOCK_SIZE) for _ in range(WINDOW_WIDTH // (BLOCK_SIZE + BLOCK_SPACING))
    ]

# 初始化排序参数
i = 0
j = 0
swapping = False

# 主循环
while True:
    # 处理退出事件
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            quit()

    # 绘制背景
    WINDOW.fill(WHITE)

    # 绘制方块
    for index, value in enumerate(arr):
        rect = pygame.Rect(index * (BLOCK_SIZE + BLOCK_SPACING), WINDOW_HEIGHT - value, BLOCK_SIZE, value)
        pygame.draw.rect(WINDOW, BLUE, rect)

    # 排序逻辑
    if not swapping:
        if j == len(arr) - i - 1:
            i += 1
            j = 0
            if i == len(arr) - 1:
                pygame.quit()
                quit()
        else:
            if arr[j] > arr[j + 1]:
                arr[j], arr[j + 1] = arr[j + 1], arr[j]
                swapping = True
            j += 1
    else:
        swapping = False
    
    # 延时更新 Pygame 窗口
    time.sleep(0.05)
    pygame.display.update()

运行之前先使用pip install pygame安装依赖的pygame模块。

运行代码:

Python是一门非常不错的编程语言,薪资待遇高、就业前景好。即使你不想出去上班,也可以利用Python在家做兼职(比如爬取客户需要的数据、量化交易、代写程序等)。

学习资源推荐

除了上述分享,如果你也喜欢编程,想通过学习Python获取更高薪资,这里给大家分享一份Python学习资料。

这里给大家展示一下我进的兼职群和最近接单的截图

兼职群

私单

😝朋友们如果有需要的话,可以V扫描下方二维码联系领取,也可以内推兼职群哦~

学好 Python 不论是就业还是做副业赚钱都不错,但要学会 Python 还是要有一个学习规划。最后大家分享一份全套的 Python 学习资料,给那些想学习 Python 的小伙伴们一点帮助!

### 1.Python学习路线

image-20230619144606466

python学习路线图1

2.Python基础学习
01.开发工具

02.学习笔记

在这里插入图片描述

03.学习视频

在这里插入图片描述

3.Python小白必备手册

图片

4.数据分析全套资源

在这里插入图片描述

5.Python面试集锦
01.面试资料

在这里插入图片描述

在这里插入图片描述

02.简历模板

在这里插入图片描述

因篇幅有限,仅展示部分资料,添加上方即可获取👆

------ 🙇‍♂️ 本文转自网络,如有侵权,请联系删除 🙇‍♂️ ------

### 回答1: 冒泡排序是一种简单的排序算法,它重复地遍历要排序的列表,比较相邻的两个元素,如果它们的顺序错误就交换它们的位置,直到没有任何一对元素需要交换为止。下面是使用 Python 编写的冒泡排序算法: ```python def bubble_sort(arr): n = len(arr) for i in range(n): # 进行 n-i-1 次比较 for j in range(n-i-1): # 如果前一个元素比后一个元素大,则交换它们的位置 if arr[j] > arr[j+1]: arr[j], arr[j+1] = arr[j+1], arr[j] # 测试代码 arr = [64, 34, 25, 12, 22, 11, 90] bubble_sort(arr) print("排序后的数组:") for i in range(len(arr)): print("%d" %arr[i], end=" ") ``` 输出结果为: ``` 排序后的数组: 11 12 22 25 34 64 90 ``` 在这个算法中,我们使用两层循环来遍历数组中的所有元素。外部循环控制比较的轮数,内部循环控制每轮比较的次数。在每一轮中,我们比较相邻的元素并根据需要交换它们的位置,从而将较大的元素“冒泡”到列表的末尾。最后,我们得到一个有序的数组。 ### 回答2: 冒泡排序是一种简单的排序算法,它通过反复交换相邻的元素来将最大(或最小)的元素逐渐"冒泡"到数列的一端。下面我将以Python语言来示范冒泡排序算法的实现过程。 在冒泡排序中,我们需要两层循环来比较和交换元素。外层循环控制比较和交换的轮数,而内层循环则用于执行具体的比较和交换操作。 首先,我们定义一个待排序的列表,例如:lst = [5, 2, 8, 12, 3]。 接下来,我们便开始进行冒泡排序算法操作。外层循环控制轮数,需要执行n-1轮比较操作(n为列表的长度),内层循环则用于相邻元素的比较和交换。 具体操作如下: 1. 外层循环从0到n-2遍历; 2. 内层循环从0到n-2-i遍历(其中i为外层循环的索引); 3. 如果相邻元素不满足排序顺序,则进行交换。 经过n-1轮比较和交换操作后,最大的元素已经冒泡到了列表的末尾。此时,我们需要对剩余的前n-1个元素再次进行n-2轮的比较和交换操作。 最终,当外层循环结束时,整个列表将按照升序排列。 以上就是用Python语言实现冒泡排序的过程。冒泡排序算法虽然简单,但是对于较大规模的数据排序效率较低,一般用于小规模数据的排序。 ### 回答3: Python 冒泡排序是基于比较的排序算法,它会多次遍历待排序的序列,每次比较相邻的两个元素,如果它们的顺序错误,则交换它们的位置,直到整个序列有序。 具体的实现步骤如下: 1. 首先,我们需要定义一个待排序的列表。 2. 接下来,我们需要进行多次遍历序列的操作,假设序列的长度为n,则需要进行n-1次遍历。 3. 在每次遍历中,从序列的第一个元素开始,比较相邻的两个元素的大小关系。如果前一个元素大于后一个元素,则交换它们的位置。 4. 继续比较下一对相邻元素,直到序列的末尾。 5. 当一次遍历完成后,可以确保序列中最大的元素已经移到了最后的位置。 6. 重复执行上述步骤,但每次遍历时将序列的长度减1。这是因为每完成一次遍历后,序列的最后一个元素已经是最大的元素了,无需再进行比较交换。 7. 最终,当遍历次数为n-1时,整个序列将会被排序。 下面是一个用Python实现的冒泡排序的例子: ```python def bubble_sort(lst): n = len(lst) for i in range(n - 1): for j in range(n - 1 - i): if lst[j] > lst[j + 1]: lst[j], lst[j + 1] = lst[j + 1], lst[j] return lst # 测试 unsorted_list = [5, 3, 8, 4, 2, 6, 1, 7] sorted_list = bubble_sort(unsorted_list) print(sorted_list) ``` 以上就是用Python实现冒泡排序的方法。冒泡排序可能不是最高效的排序算法,但是其实现简单易懂,适用于小规模的数据排序。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值