快速排序算法,总体来说就是选一个基准值,把小于基准值的分一拨,把大于基准值的分到另一拨,然后递归。

  有区别的是,分区算法有差异,最直接的是,选个基准值,定义两个列表(小值分区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种快速排序算法的更多相关文章

  1. python:实现几种排序算法

    冒泡排序 比较相邻两个字符,如果左边大于右边,则交换位置,遍历一遍字符后,则最大的肯定在最右边:继续循环处理剩下的字符(最右边的不用再比较了,已经最大了) 代码实现: def BubbleSort(s ...

  2. python实现常用五种排序算法

    一.冒泡排序 原理: 比较相邻的元素.如果第一个比第二个大就交换他们两个 每一对相邻元素做同样的工作,直到结尾最后一对 每个元素都重复以上步骤,除了最后一个 第一步: 将乱序中的最大值找出,逐一移到序 ...

  3. 几种排序算法的学习,利用Python和C实现

    之前学过的都忘了,也没好好做过总结,现在总结一下. 时间复杂度和空间复杂度的概念: 1.空间复杂度:是程序运行所以需要的额外消耗存储空间,一般的递归算法就要有o(n)的空间复杂度了,简单说就是递归集算 ...

  4. python实现快速排序算法

    快速排序算法又称划分交换排序(partition-exchange sort),一种排序算法,最早由东尼·霍尔提出.在平均状况下, 排序n个项目要O(nlogn)次比较.在最坏状况下则需要O(n*2) ...

  5. php四种基础算法:冒泡,选择,插入和快速排序法

    转自:http://www.php100.com/html/php/rumen/2013/1029/6333.html 许多人都说 算法是程序的核心,一个程序的好于差,关键是这个程序算法的优劣.作为一 ...

  6. 10 种机器学习算法的要点(附 Python 和 R 代码)

    本文由 伯乐在线 - Agatha 翻译,唐尤华 校稿.未经许可,禁止转载!英文出处:SUNIL RAY.欢迎加入翻译组. 前言 谷歌董事长施密特曾说过:虽然谷歌的无人驾驶汽车和机器人受到了许多媒体关 ...

  7. $用python实现快速排序算法

    本文主要介绍用python实现基本的快速排序算法,体会一下python的快排代码可以写得多么简洁. 1. 三言两语概括算法核心思想 先从待排序的数组中找出一个数作为基准数(取第一个数即可),然后将原来 ...

  8. 10 种机器学习算法的要点(附 Python)(转载)

    一.前言 谷歌董事长施密特曾说过:虽然谷歌的无人驾驶汽车和机器人受到了许多媒体关注,但是这家公司真正的未来在于机器学习,一种让计算机更聪明.更个性化的技术 也许我们生活在人类历史上最关键的时期:从使用 ...

  9. 机器学习10种经典算法的Python实现

    广义来说,有三种机器学习算法 1. 监督式学习 工作机制:这个算法由一个目标变量或结果变量(或因变量)组成.这些变量由已知的一系列预示变量(自变量)预测而来.利用这一系列变量,我们生成一个将输入值映射 ...

随机推荐

  1. 【系统设计】不同分类的商品动态添加扩展属性的方法(WMS、小型电商)

    在做公司WMS系统的时候,遇到了一个商品模块的设计问题,具体业务流程如下. 客户提供需要存放的商品清单,根据商品清单生成收货单给客户,然后生成入库单进行商品入库操作. 在生成这两个单之前首先要录入商品 ...

  2. 团队作业part2--需求规格说明书

    需求规格说明书 一.目的 本说明书为了让用户尽快了解产品所含功能,描述用户对产品的期望与需求.明确软件开发的最终目的,使开发出来的软件能够更好的达到用户的需求.其作为用户和软件开发人员达成的技术协议书 ...

  3. python+eclipse 引用 import requests报错解决。

    用pip install requests命令执行安装下 再重启eclipse就好了. 用pip install requests命令执行安装下 再重启eclipse就好了. 用pip install ...

  4. AcWing 339 .圆形数字

    大型补档计划 题目链接 设 \(f[i][j]\) 表示二进制下,数字有 \(i\) 位, \(0\) 的个数 - \(1\) 的个数 \(=\) \(j\) 的方案数 \(f[0][0] = 1;\ ...

  5. 【AtCoder AGC023F】01 on Tree(贪心)

    Description 给定一颗 \(n\) 个结点的树,每个点有一个点权 \(v\).点权只可能为 \(0\) 或 \(1\). 现有一个空数列,每次可以向数列尾部添加一个点 \(i\) 的点权 \ ...

  6. springboot配置ssl证书

    springboot默认使用的是tomcat: 1.先到阿里云上注册一个证书,绑定域名:后面可以在管理中下载证书,下载tomcat对应的证书(一个*.pfx文件和*.txt文件) 2.将pfx文件拷贝 ...

  7. linux 设置别名

    [root@oldboyedu45-xy data]# alias(查找别名) alias cp='cp -i' alias l.='ls -d .* --color=auto' alias ll=' ...

  8. Centos安装JDK、Tomcat

    准备工作,先下载JDK.Tomcat包:使用FileZilla将软件包发送到/home/software目录下. 1 安装JDK8 首先卸载已有的JDK. # 查看版本 java -version # ...

  9. JavaScript:正则表达式匹配规则

    正则表达式的语法规则: <!DOCTYPE html> <html lang="en"> <head> <meta charset=&qu ...

  10. node目录

    1 [了解nodejs] 1.1 [node简介] 1.2 [node的特点] 1.3 [如何安装] 1.4 [如何运行] 2 [es6--基本语法] 2.1 [变量的解构赋值] 2.2 [解构赋值] ...