算法实现迭代4_冒泡排序
在之前汇总的所有算法 整理汇总各排序算法(用python实现) 的基础上,不断迭代更新使得功能,使得越来越完善.
一.冒泡排序
#06 冒泡排序
'''
冒泡排序(Bubble Sort)也是一种简单直观的排序算法。
它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。
走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。
这个算法的名字由来是因为越小的元素会经由交换慢慢"浮"到数列的顶端
'''
def bubbleSort(arr):n = len(arr)print("循环内n为:",n)# 遍历所有数组元素for i in range(n):# 最后i个元素已经就位for j in range(0, 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]
print('初始序列为:',arr)
bubbleSort(arr)
print ("\n冒泡排序后的数组:")
for i in range(len(arr)):print ("%d" %arr[i]),
二.冒泡排序简化
#06.2 冒泡排序def bubbleSort(arr):n = len(arr)# 遍历所有数组元素for i in range(n):# 最后i个元素已经就位for j in range(0, 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]
print("\n初始序列长为:{}\n序列为:{}".format(len(arr),arr))
bubbleSort(arr)
print(f"\n希尔排序横向输出后为:\n{arr}")
三.冒泡排序可视化保存
#06.3 冒泡排序可视化保存import matplotlib.pyplot as plt
import matplotlib.animation as animation
import numpy as np#冒泡排序可视化:展示相邻元素比较交换过程
def bubble_sort_visual(arr, ax, title="冒泡排序过程", save_path="冒泡排序.gif"):frame_list = [] # 记录排序过程中的每一步状态original_arr = arr.copy() # 保留原始数据副本# ================== 冒泡排序核心算法 ==================n = len(arr)for i in range(n):# 记录每轮开始前的状态frame_list.append(arr.copy())# 最后i个元素已经有序for j in range(0, n - i - 1):if arr[j] > arr[j + 1]:# 交换相邻元素arr[j], arr[j + 1] = arr[j + 1], arr[j]# 记录每次交换后的状态frame_list.append(arr.copy())# ================== 可视化设置 ==================ax.set_xlim(-0.5, len(arr) - 0.5)ax.set_ylim(0, max(original_arr) * 1.2)ax.set_title(title, fontsize=16, fontproperties='SimHei')ax.set_xticks([])ax.set_yticks([])# 颜色映射(数值越大颜色越深)colors = plt.cm.Blues(np.linspace(0.3, 1, len(arr)))bars = ax.bar(range(len(arr)), original_arr,color=colors, edgecolor='black', linewidth=0.5)# 数值标签offset = 0.3text_labels = [ax.text(i, original_arr[i] + offset, str(original_arr[i]),ha='center', va='bottom', fontsize=10, fontproperties='SimHei')for i in range(len(original_arr))]# ================== 动画更新 ==================def update(frame):# 更新柱子高度for i, bar in enumerate(bars):bar.set_height(frame[i])# 更新颜色(根据当前值重新映射)norm = plt.Normalize(0, max(frame))colors = plt.cm.Blues(norm(frame))for bar, color in zip(bars, colors):bar.set_color(color)# 更新数值标签for i, text in enumerate(text_labels):text.set_y(frame[i] + offset)text.set_text(str(frame[i]))return bars, text_labelsani = animation.FuncAnimation(fig, update, frames=frame_list,interval=300, # 每帧间隔300msblit=False, repeat=False)ani.save(save_path, writer='pillow', fps=10, dpi=100)return ani# ================== 使用示例 ==================
if __name__ == "__main__":# 设置中文字体plt.rcParams['font.sans-serif'] = ['SimHei']plt.rcParams['axes.unicode_minus'] = False# 初始化数据arr = [64, 34, 25, 12, 22, 11, 90]fig, ax = plt.subplots(figsize=(14, 6))# 生成动画ani = bubble_sort_visual(arr, ax,title="冒泡排序动态演示",save_path="./冒泡排序演示.gif")plt.tight_layout()plt.show()
整理不易,诚望各位看官点赞 收藏 评论 予以支持,这将成为我持续更新的动力源泉。若您在阅览时存有异议或建议,敬请留言指正批评,让我们携手共同学习,共同进取,吾辈自当相互勉励!