python-快速排序
时间:2022-07-24
本文章向大家介绍python-快速排序,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
核心思想:取一个初始值,将数组中比该值小的放在其左边,比其大的放在右边, 再对左、右子数组进行相同操作,直到数组排好序。
def quicksort(nums):
l = 0
r = len(nums) - 1
_quicksort(nums,l,r)
def _quicksort(nums,l,r):
if l < r:
p = partition(nums,l,r)
_quicksort(nums,l,p-1)
_quicksort(nums,p+1,r)
def partition(nums,l,r):
base = nums[l]
j = l+1
for i in range(l+1,r+1):
if nums[i]<base:
nums[i],nums[j]=nums[j],nums[i]
j+=1
nums[l],nums[j-1]=nums[j-1],nums[l]
return j-1
nums = [6,2,5,3,4,8,1,7]
quicksort(nums)
print(nums)
改进:随机选择初始值,避免数组有序使算法退化。从两边开始遍历,减少遍历时间。
import random
def quicksort(nums):
l = 0
r = len(nums) - 1
_quicksort(nums,l,r)
def _quicksort(nums,l,r):
if l < r:
p = partition(nums,l,r)
_quicksort(nums,l,p-1)
_quicksort(nums,p+1,r)
def partition(nums, l, r):
ind = random.randint(l, r)
nums[l], nums[ind] = nums[ind], nums[l]
base = nums[l]
i, j = l+1, r
while True:
while i <= r and nums[i] < base: # 不能改为nums[i] <= base
i += 1
while j >= l + 1 and nums[j] > base: # 不能改为nums[j] >= base.
j -= 1
if i > j:
break
else:
nums[i], nums[j] = nums[j], nums[i]
i += 1
j -= 1
nums[j], nums[l] = nums[l], nums[j]
return j
nums = [6,2,5,3,4,8,1,7]
quicksort(nums)
print(nums)
改进:三路快排,用于解决数组中有较多重复的值。
import random
def quicksort(nums):
l = 0
r = len(nums) - 1
_quicksort(nums,l,r)
def _quicksort(nums,l,r):
if l < r:
lt,gt = partition(nums,l,r)
_quicksort(nums,l,lt-1)
_quicksort(nums,gt,r)
def partition(nums, l, r):
ind = random.randint(l, r)
nums[l], nums[ind] = nums[ind], nums[l]
base = nums[l]
lt = l # nums[l+1...lt] < base
gt = r + 1 # nums[gt...r] > base
i = l + 1 # nums[lt+1...i] == base
while (i < gt):
# i==gt时表示已经比较结束
if (nums[i] < base):
nums[i], nums[lt+1] = nums[lt+1], nums[i]
lt += 1
i += 1
elif (nums[i] > base):
nums[i], nums[gt-1] = nums[gt-1], nums[i]
gt -= 1
else: # nums[i] == base
i += 1
nums[l], nums[lt] = nums[lt], nums[l]
return lt, gt
nums = [6,2,5,3,4,8,1,7]
quicksort(nums)
print(nums)
- 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 数组属性和方法
- 为tinycolinux创建应用包-toolchain和编译方法
- [译]在Solidity中如何优化Gas第一部分:变量
- [译]Solidity 0.7.0 新变化
- 两个数组的交集 II
- 常说的手机刷新率60Hz、120Hz有什么不同?
- Istio 运维实战系列(3):让人头大的『无头服务』-下
- java安全编码指南之:可见性和原子性
- java安全编码指南之:敏感类的拷贝
- 测试面试题集-MySQL数据库灵魂拷问
- Linux提权姿势一:滥用SUDO提权
- Linux提权姿势二:利用NFS提权
- 统计回归拟合方程参数
- biomaRt包实现不同物种之间同源基因转换
- 使用OpenCV和Python标记超像素色彩
- 听说,你的Loki还是单体?(上篇)