使用Python实现的4种快速排序算法
快速排序算法,总体来说就是选一个基准值,把小于基准值的分一拨,把大于基准值的分到另一拨,然后递归。
有区别的是,分区算法有差异,最直接的是,选个基准值,定义两个列表(小值分区less和大值分区great),然后挨个比较,小的追加到less,大的追加到great
再有就是,选个基准值,先从右边开始比,比基准值大的不管,比基准值小就和基准值换位置,换一次后,就去和左边比,比基准值小的不管,比基准值大的又去换位置,略有些绕。
最后,还可以不递归,通过把分区节点保存在栈里来实现。
1 # -*- coding: utf-8 -*-
2
3 import numpy as np
4 #1)依次对比arr[0]和其他元素,比arr[0]小的话,就原地删除,然后插入到arr[0]前面,基准值后移。大于等于,则不处理。然后递归
5 #原地排序
6 def quick_sort1(arr,left,right):
7
8 if left>=right:
9 return
10 flag=left
11 for i in range(left+1,right+1):
12 if arr[flag]>arr[i]:
13 temp=arr[i]
14 del arr[i]
15 arr.insert(flag,temp)
16 flag+=1
17 quick_sort1(arr,left,flag-1)
18 quick_sort1(arr,flag+1,right)
19 #2)基准值arr[0],对比所有元素,比它小就追加到less后面,比它大就追加到great后面,相等就追加到pivot后面,然后递归
20 #返回排序后的列表
21 def quick_sort2(arr):
22 less=[]
23 great=[]
24 pivot=[]
25 if len(arr)<=1:
26 return arr
27 else:
28 p=arr[0]
29 for i in arr:
30 if i<p:
31 less.append(i)
32 elif i>p:
33 great.append(i)
34 else:
35 pivot.append(i)
36 less=quick_sort2(less)
37 great=quick_sort2(great)
38 return less+pivot+great
39 #2-2)基本思想同上,代码更简化
40 def quick_sort22(arr):
41 if len(arr)<=1:
42 return arr
43 else:
44 return quick_sort22([i for i in arr[1:] if i<arr[0]])+[arr[0]]+quick_sort22([i for i in arr[1:] if i>=arr[0]])
46 #2-3)思路同上,更简化的版本
47 quick_sort23=lambda xs:((len(xs)<=1 and [xs]) or [quick_sort23([x for x in xs[1:] if x<xs[0]])+[xs[0]]+quick_sort23([x for x in xs[1:] if x>=xs[0]])])[0]
49 quick_sort24=lambda arr:arr if len(arr)<=1 else quick_sort24([x for x in arr[1:] if x<arr[0]])+[arr[0]]+quick_sort24([x for x in arr[1:] if x>=arr[0]])
#lambda 参数:取值1,如果满足条件1,否则,取值2
51
52
53 #3)定义两个函数:分区和排序。分区是要把列表元素移动位置,直到基准值arr[0]移到中间(左边都比它小,右边都比它大)。排序则调用分区并递归
54 #原地排序
55 def partition(arr,i,j):
56 p=arr[i]
57 while i!=j:
58 while i<j and p<=arr[j]:#此处添加=,解决了之前遇到的序列中有重复值时死循环的问题
59 j-=1
60 arr[i]=arr[j]
61 while i<j and p>arr[i]:
62 i+=1
63 arr[j]=arr[i]
64 arr[i]=p
65 return i
66 def quick_sort3(arr,i,j):
67 if i<j:
68 mid=partition(arr,i,j)
69 quick_sort3(arr,i,mid-1)
70 quick_sort3(arr,mid+1,j)
71 #3-2)上述思路的变体,分区函数变动,每次都比右边是否比基准值大,大的话,j前移,否则,把arr[j]给到arr[i],然后i后移,arr[i]再给到arr[j],继续上述循环
72 def partition2(arr,i,j):
73 p=arr[i]
74 while i!=j:
75 while i<j and p<=arr[j]:
76 j-=1
77
78 while i<j and p>arr[j]:
79 arr[i]=arr[j]
80 i+=1
81 arr[j]=arr[i]
82 arr[i]=p
83 return i
84 def quick_sort32(arr,i,j):
85 if i<j:
86 mid=partition2(arr,i,j)
87 quick_sort32(arr,i,mid-1)
88 quick_sort32(arr,mid+1,j)
89 #3-3)分区函数变动,基准值为最后一个值,依次比较,如果比基准值小,就换到前面去,最后再把基准值换到中间。
90 def partition3(arr,i,j):
91 p=arr[j]
92 x=i-1
93 for y in range(i,j):
94 if arr[y]<=p:
95 x+=1
96 arr[x],arr[y]=arr[y],arr[x]
97 arr[x+1],arr[j]=arr[j],arr[x+1]
98 return x+1
99 def quick_sort33(arr,i,j):
100 if i<j:
101 mid=partition3(arr,i,j)
102 quick_sort33(arr,i,mid-1)
103 quick_sort33(arr,mid+1,j)
104 #4)非递归方式,使用栈,思路类似previous,只是把切分边界保存在栈(用list实现)里,\
105 #当只剩一个元素时,跳出本次循环,进入下次循环,看下一个区间里元素值是否多于1个,直到栈空
106 def quick_sort4(arr,i,j):
107 if j<=i:
108 return
109 stack=[]
110 stack.extend([i,j])
111 while stack:
112 left=stack.pop(0)
113 right=stack.pop(0)
114 if right<=left:
115 continue
116 x=left-1
117 p=arr[right]
118 for y in range(left,right):#此处循环不包括最后一个元素,循环结束后,最后一个元素换到中间
119 if arr[y]<=p:
120 x+=1
121 arr[x],arr[y]=arr[y],arr[x]
122 arr[x+1],arr[right]=arr[right],arr[x+1]
123 stack.extend([left,x,x+2,right])
124
125
126 if __name__=="__main__":
127 s=np.random.randint(1,30,20).tolist()
128 print(s)
129 #print(quick_sort24(s))
130 quick_sort4(s,0,len(s)-1)
131 print(s)
使用Python实现的4种快速排序算法的更多相关文章
- python:实现几种排序算法
冒泡排序 比较相邻两个字符,如果左边大于右边,则交换位置,遍历一遍字符后,则最大的肯定在最右边:继续循环处理剩下的字符(最右边的不用再比较了,已经最大了) 代码实现: def BubbleSort(s ...
- python实现常用五种排序算法
一.冒泡排序 原理: 比较相邻的元素.如果第一个比第二个大就交换他们两个 每一对相邻元素做同样的工作,直到结尾最后一对 每个元素都重复以上步骤,除了最后一个 第一步: 将乱序中的最大值找出,逐一移到序 ...
- 几种排序算法的学习,利用Python和C实现
之前学过的都忘了,也没好好做过总结,现在总结一下. 时间复杂度和空间复杂度的概念: 1.空间复杂度:是程序运行所以需要的额外消耗存储空间,一般的递归算法就要有o(n)的空间复杂度了,简单说就是递归集算 ...
- python实现快速排序算法
快速排序算法又称划分交换排序(partition-exchange sort),一种排序算法,最早由东尼·霍尔提出.在平均状况下, 排序n个项目要O(nlogn)次比较.在最坏状况下则需要O(n*2) ...
- php四种基础算法:冒泡,选择,插入和快速排序法
转自:http://www.php100.com/html/php/rumen/2013/1029/6333.html 许多人都说 算法是程序的核心,一个程序的好于差,关键是这个程序算法的优劣.作为一 ...
- 10 种机器学习算法的要点(附 Python 和 R 代码)
本文由 伯乐在线 - Agatha 翻译,唐尤华 校稿.未经许可,禁止转载!英文出处:SUNIL RAY.欢迎加入翻译组. 前言 谷歌董事长施密特曾说过:虽然谷歌的无人驾驶汽车和机器人受到了许多媒体关 ...
- $用python实现快速排序算法
本文主要介绍用python实现基本的快速排序算法,体会一下python的快排代码可以写得多么简洁. 1. 三言两语概括算法核心思想 先从待排序的数组中找出一个数作为基准数(取第一个数即可),然后将原来 ...
- 10 种机器学习算法的要点(附 Python)(转载)
一.前言 谷歌董事长施密特曾说过:虽然谷歌的无人驾驶汽车和机器人受到了许多媒体关注,但是这家公司真正的未来在于机器学习,一种让计算机更聪明.更个性化的技术 也许我们生活在人类历史上最关键的时期:从使用 ...
- 机器学习10种经典算法的Python实现
广义来说,有三种机器学习算法 1. 监督式学习 工作机制:这个算法由一个目标变量或结果变量(或因变量)组成.这些变量由已知的一系列预示变量(自变量)预测而来.利用这一系列变量,我们生成一个将输入值映射 ...
随机推荐
- [SWPU2019]Web1 空格过滤用/**/ 注释过滤闭合单引号 imformation_schema.columns/tables过滤 用5.7新特性 或无名注入(此处database()不能用)
0x00 知识点 二次注入流程分析 二次注入漏洞在CTF中常见于留言板和注册登录功能,简单来说可以分为两个步骤: 插入恶意数据(发布帖子,注册账号),用mysql_escape_string()函数对 ...
- 推荐系统(CTR领域)实战入门指南
CTR经典模型如:FM,FFM,Wide&Deep,建议自己去复现一个完整的通用模型 先从pytorch版本入手(后期考虑tensorflow),从kaggle上找实际的比赛 github 相 ...
- 你知道Python基本数据类型是哪6个么
Python 是强类型语言,在学习 Python 时,有必要了解 Python 有哪些基本数据类型,一共 6 个:Number(数字).String(字符串).List(列表).Tuple(元组).S ...
- vue Export2Excel 导出文件
使用需要引入这些js 在src目录下创建一个文件(vendor)进入Blob.js和Export2Excel.js npm install -S file-saver 用来生成文件的web应用程序 n ...
- 11g RAC开启归档模式
1.关闭集群数据库 [oracle@rac01-+ASM1 ~]$ srvctl stop database -d rac 2.开启节点一数据库到mount状态 SQL> startup mou ...
- js 控制输入框保存数字级小数点后一位
$('#Question8').on('keyup', function () { var regVoter = $("#Question8").val(); regVoter = ...
- 二、Electron + Webpack + Vue 搭建开发环境及打包安装
目录 Webpack + Vue 搭建开发环境及打包安装 ------- 打包渲染进程 Electron + Webpack 搭建开发环境及打包安装 ------- 打包主进程 Electron + ...
- Python 中的运算符重载
本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理 一种运算符对于不同类型的对象,有不同的使用方式.例如, + 用于整型对象,表示两个数相加:用于字符串 ...
- .NET Core 使用MediatR CQRS模式 读写分离
前言 CQRS(Command Query Responsibility Segregation)命令查询职责分离模式,它主要从我们业务系统中进行分离出我们(Command 增.删.改)和(Query ...
- 从零实现Linux一键自动化部署.netCore+Vue+Nginx项目到Docker中
环境搭建 1.安装Linux,这里我用的阿里云服务器,CentOS7版本 2.进入Linux,安装Docker,执行以下命令 sudo yum update #更新一下yum包 sudo yum in ...