python - 这种排序算法可以被认为是冒泡排序的变体吗?
问题描述
这种方法可以被认为是冒泡排序的一种变体吗?如果不是,那么主要区别是什么?这种方法与冒泡排序之间的效率比较是什么?
def bubble_sort(arr):
for i in range(len(arr)):
for j in range(len(arr)-i):
if arr[i] > arr[j+i]:
arr[i], arr[j+i] = arr[j+i], arr[i]
return arr
if __name__ == '__main__':
arr = [21,4,1,3,9,20,25,6,21,14]
print(bubble_sort(arr))
输出:[1、3、4、6、9、14、20、21、21、25]
解决方案
您的代码实现了算法选择排序而不是冒泡排序。尽管它们有些相似:它们都基于元素交换。
对于选择排序,算法的关键是找到最小或最大元素并最后交换:
该算法通过在未排序的子列表中找到最小(或最大,取决于排序顺序)元素,将其与最左边的未排序元素交换(交换)(将其按排序顺序),并将子列表边界向右移动一个元素.
并且可以改进您的代码以避免不必要的交换:
import random
def my_sort(arr):
for i in range(len(arr)):
min_idx = i
for j in range(len(arr)-i):
if arr[min_idx] > arr[j+i]:
min_idx = j + i
arr[i],arr[min_idx] = arr[min_idx], arr[i]
return arr
if __name__ == '__main__':
for i in range(360):
i = i + 1
r = random.choices(range(i * 10), k=i) # Get list of numbers
r1 = r.copy()
assert my_sort(r) == sorted(r1)
推荐阅读
- bash - 使用代理 Ubuntu-16.04 在 azure-devops 管道 bash cake 任务中获取 ##[error] Bash 并以代码“1”退出
- python - 在同一张图上用彩色图绘制多列数据框
- c - 如果缺少某些字段,我想知道如何存储以分号分隔的文本的输入
- javascript - 如何将图像 URI 转换为字节博览会
- react-native - KeyBoard 避免使用绝对位置元素查看视图
- ruby - OctoKit Ruby 身份验证
- reactjs - 单击时不显示模态(React)
- c# - Ocelot .NET Core 平衡问题与已关闭的微服务
- firebase - Firestore 如果文档不存在则创建文档,如果存在则跳过
- python - 使用 Python 提取文本中多次出现的字符串的周围字符