Python,学霸
阅读指南
原理
实例
输出
gif演示制作
原理
选择排序是一种简单直观的排序算法。其原理是通过遍历待排序的元素,每次选出最小(或最大)的元素,并将其放置在已排序序列的末尾。具体步骤如下:
首先,从待排序序列中找到最小(或最大)的元素,并将其与序列的第一个元素交换位置。
然后,在剩余的未排序序列中,继续寻找最小(或最大)的元素,将其与序列的第二个元素交换位置。
以此类推,重复执行上述操作,直到所有元素都被排序。
实例
from typing import List
def selection_sort(arr: List[int]) -> List[int]:
n = len(arr)
for i in range(n):
min_index = i
for j in range(i + 1, n):
if arr[j] < arr[min_index]:
min_index = j
arr[i], arr[min_index] = arr[min_index], arr[i]
return arr
#选择排序算法
arr = [9, 1, 7, 2, 5]
sorted_arr = selection_sort(arr)
print(sorted_arr) #输出排序后的数组
输出
[1, 2, 5, 7, 9]
生成gif演示图:
from PIL import Image, ImageDraw
import random
def generate_image(arr, moving_index, swap_index):
#图片的基本参数
image_width = 800
image_height = 600
bar_width = 40
bar_padding = 10
x_offset = 50
#创建一个空白图片
image = Image.new('RGB', (image_width, image_height), (255, 255, 255))
draw = ImageDraw.Draw(image)
#绘制柱状图
for i in range(len(arr)):
bar_height = arr[i] * (image_height - 100) // max(arr)
x0 = x_offset + i * (bar_width + bar_padding)
y0 = image_height - bar_height
x1 = x0 + bar_width
y1 = image_height
color = (255, 140, 0) # 未排序好的方块颜色
if i in moving_index:
color = (0, 255, 0) # 正在移动的方块颜色
elif i in swap_index:
color = (220, 20, 60) # 正在交换的方块颜色
draw.rectangle([x0, y0, x1, y1], fill=color)
return image
def selection_sort_animation(arr):
frames = []
n = len(arr)
for i in range(n):
min_index = i
for j in range(i + 1, n):
if arr[j] < arr[min_index]:
min_index = j
#生成移动过程帧
moving_index = [min_index]
frame = generate_image(arr, moving_index, [])
frames.append(frame)
#生成交换过程帧
swap_index = [i, min_index]
frame = generate_image(arr, [], swap_index)
frames.append(frame)
#交换元素
arr[i], arr[min_index] = arr[min_index], arr[i]
#生成当前最小值到正确位置的帧
frame = generate_image(arr, [], [])
frames.append(frame)
return frames
#选择排序算法
arr = [9, 1, 7, 2, 5] # 待排序数据
frames = selection_sort_animation(arr)
#保存为GIF
frames[0].save('sorting.gif', format='GIF',
append_images=frames[1:],
save_all=True,
duration=900,
loop=0)
相关文章: