Python实现6种排序算法,快排只有6行?
时间:2022-07-22
本文章向大家介绍Python实现6种排序算法,快排只有6行?,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
通过实现 6 种经典的排序算法,尽展 Python 的简而美~
- 快速排序
- 归并排序
- 堆排序
- 插入排序
- 冒泡排序
- 选择排序
快速排序
def quick_sort(arr):
if len(arr) < 2:
return arr[:]
left = quick_sort([i for i in arr[1:] if i <= arr[0]])
right = quick_sort([i for i in arr[1:] if i > arr[0]])
return left + [arr[0]] + right
经典快排实现
def quick_sort(arr):
def partition(arr, s, e):
key = arr[0]
while s < e:
while s < e and arr[e] >= key: e -= 1
arr[s] = arr[e]
while s < e and arr[s] <= key: s += 1
arr[e] = arr[s]
return s
def quick_sort_recursion(arr, s, e):
if s < e:
idx = partition(arr, s, e)
quick_sort_recursion(arr, s, idx - 1)
quick_sort_recursion(arr, idx + 1, e)
quick_sort_recursion(arr, 0, len(arr) - 1)
return arr
归并排序
def merge_sort(arr):
def merge(left, right):
rs = []
i = j = 0
while i < len(left) and j < len(right):
if left[i] < right[j]:
rs.append(left[i])
i += 1
else:
rs.append(right[j])
j += 1
rs += left[i:]
rs += right[j:]
return rs
def merge_sort_recursion(arr):
if len(arr) in [0, 1]: # 停止分裂,最小子问题
return arr
mid = len(arr) // 2
left = merge_sort_recursion(arr[:mid])
right = merge_sort_recursion(arr[mid:])
return merge(left, right)
return merge_sort_recursion(arr)
堆排序
def heap_sort(arr):
def init_heap(arr):
n = len(arr)
last_parent = (n - 1) // 2 # 最后一个parent节点
for i in range(last_parent, -1, -1):
adjust_heap(arr, n, i)
def adjust_heap(arr, max_length, parent):
left = 2 * parent + 1
right = 2 * parent + 2
largest = parent
if left < max_length and arr[left] > arr[largest]:
largest = left
if right < max_length and arr[right] > arr[largest]:
largest = right
if parent != largest:
arr[parent], arr[largest] = arr[largest], arr[parent]
adjust_heap(arr, max_length, largest)
init_heap(arr) #初始化大顶堆
for i in range(len(arr) - 1, -1, -1):
arr[i], arr[0] = arr[0], arr[i] # 每次将最大值移到最后
adjust_heap(arr, i, 0)
return arr
插入排序
def insert_sort(arr):
for i in range(1, len(arr)):
for j in range(i, 0, -1):
if arr[j] < arr[j - 1]:
arr[j], arr[j - 1] = arr[j - 1], arr[j]
else:
break
return arr
冒泡排序
def bubble_sort(arr):
n = len(arr)
for i in range(n - 1):
for j in range(0, n - 1 - i):
if arr[j] > arr[j + 1]:
arr[j + 1], arr[j] = arr[j], arr[j + 1]
return arr
选择排序
def select_sort(arr):
n = len(arr)
for i in range(0, n - 1):
min_idx = i
for j in range(i + 1, n):
if arr[j] < arr[i]:
min_idx = j
if i != min_idx:
arr[i], arr[min_idx] = arr[min_idx], arr[i]
return arr
测试程序
if __name__ == '__main__':
import numpy as np
arr = list(np.random.randint(0, 100, 100))
print(quick_sort(arr))
print(merge_sort(arr))
print(heap_sort(arr))
print(bubble_sort(arr))
print(select_sort(arr))
print(insert_sort(arr))
- pyecharts(一):Python可视化利器
- 如何在Python中保存ARIMA时间序列预测模型
- SVN+Apache域用户认证配置方法_Windows(转,重新排版,部分内容更新优化)
- sum(x) over( partition by y ORDER BY z ) 分析
- Android DataBinding 数据绑定
- Flask拾遗笔记之上下文
- switch.....case....使用最容易犯错的地方
- electron 构建跨平台桌面应用
- 两个关于字符串的经典例子
- Android Wear 开发初探
- Android动态布局入门及NinePatchChunk解密
- WebAssembly
- 使用 Jest 进行前端单元测试
- Android Auto开发初探
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- KVM 实现虚拟机在线热迁移
- 机器重启后 docker 容器启动报错 error creating overlay mount t
- 微信小程序开发实战(14):音频组件(audio)
- dotnet OpenXML 文本 BodyProperties 的属性作用
- 微信小程序开发实战(15):视频组件(video)
- LeetCode 91,点赞和反对五五开,这题是好是坏由你来评判
- 打破国外垄断,开发中国人自己的编程语言(1):编写解析表达式的计算器
- 在CentOS8上编译安装开源EDA工具——Surelog
- 直播带货小程序源码中,商品详情页是如何获取html图片的
- LeetCode 90 | 经典递归问题,求出所有不重复的子集II
- 万字长文|Swift语法全面解析|附示例
- sshd服务搭建与管理
- Airflow Dag可视化管理编辑工具Airflow Console
- 使用 Clientset 获取 Kubernetes 资源对象
- Python爬虫 - 解决动态网页信息抓取问题