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)
- Nagios:企业级系统监控方案
- 从零开始搭建前端数据监控系统(一)-同类产品调研
- Kafka剖析系列之高可用(上)
- 大量图片优化
- ASP.NET 4.0 URL Routing HTTP Error 404.0 - Not Found
- 从零开始搭建前端数据监控系统(二)-前端性能监控方案调研
- 14个你可能不知道的JavaScript调试技巧
- Kafka剖析系列之高可用(下)
- 11 个简单的 Java 性能调优技巧
- NativeScript工作原理
- 如何合并Git 代码库中牛人的代码到自己的库
- Kafka剖析系列之Consumer解析
- android之View绘制
- 高性能JavaScript-JS脚本加载与执行对性能的影响
- 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 数组属性和方法
- 学了这个,三歪再也不想写各种setter了
- 使用 GitLab CI 与 Argo CD 进行 GitOps 实践
- Java 语言中十大“坑爹”功能!
- 面试:说说啥是一致性哈希算法?
- 问一下,线程池里面到底该设置多少个线程?
- 进程和线程基础知识全家桶,30 张图一套带走
- Python-matplotlib 学术柱状图绘制
- 为什么要避免大事务以及大事务如何解决?
- [即时通信IM]群@消息如何实现?
- 利用PySpark对 Tweets 流数据进行情感分析实战
- ConcurrentHashMap源码学习
- HashMap源码学习
- Pytest自动化测试fixture之conftest.py
- ArrayList源码学习
- 科技将带给我们什么变化?讲述基于 HTML5 WebGL 的 3D 科幻风机