Python之排序算法:快速排序与冒泡排序

转载请注明源地址:http://www.cnblogs.com/funnyzpc/p/7828610.html

  入坑(简称IT)这一行也有些年头了,但自老师讲课提过排序算法后几乎再也没写过排序算法,当然这也没有什么问题,实际的排序大多是将数据从数据库取出来前在数据库中就已经做好排序了,当然这个排序是SQL范畴的,如果真的需要在代码中排序也有对应的工具类来处理,就比如有Java中有Array.sort()来排列Array(数组类型),功能虽说有限制,但也免去了撸码的时间,嗯,不用写的大好处就是减少了开发时间,当然也增加了喝咖啡、网购的时间~

闲言多废话,先展示下快速排序的动态图再出代码,方便理解:

(上图是从维基百科中抓取的,包括本节所讲所的冒泡排序也是维基百科的)

  嗯,酷酷的时间到了,先我大概讲下快速排序

    A>先取一个数(一般是第一个数)作为参照的基准值

    B>将待排序的数组分两边,一左一右分别指向数组的两边

    C>左右两边分别向中间移,所指的数值大于基准值的向基准值右边放(如果是右边所指的值就挪动指向的位置,值不动),左边也一样

    D>将基准位置两边的值分别排序(一般是递归调用)

好了,以上大概就是快速排序的的一半步骤,如有不懂之处,建议顺着代码来推测快速排序的整个过程,并不难

 #!/usr/bin/env Python
#快速排序法
def quickSort(arr,_l,_r):
l,r,t=_l,_r,0
if l <= r:
t=arr[_l] #基准参数
while(l<r):
#当右边的值大于基准参数时,右值向左挪一(位置和值)
while l<r and arr[r]>=t:
r=r-1
arr[l]=arr[r] #右值挪到左值的位置
# 当左边的值小于基准参数时,右值向左挪一(位置和值)
while l<r and arr[l]<=t:
l=l+1
arr[r]=arr[l] #左值放入右值的位置
'''
当前一轮排完后将基准参数放入
将基准值左右两边的数值分别放入排序(递归调用)
'''
arr[r]=t #基准参数归位 quickSort(arr,_l,l-1) #基准位置左侧数据排序
quickSort(arr,l+1,_r) #基准位置右侧数据排序 i=[23,1,6,77,8,-11,100,11.1,99,24,21]
print ("排序之前")
print (i)
print ("排序之后")
quickSort(i,0,len(i)-1)
print (i) ==========以下是控制台输出=========== 排序之前
[23, 1, 6, 77, 8, -11, 100, 11.1, 99, 24, 21]
排序之后
[-11, 1, 6, 8, 11.1, 21, 23, 24, 77, 99, 100]

嗯~,快速排序完毕,先展示下冒泡排序的动态图,密集恐惧症者勿入

 

结合着图,冒泡排序的过程大致是这样子的:

  A>取待排序数组中的一个值(一般是第一个值)作为基准值依次与其它所有数值比较

  B>大于基准值的直接略过,小于基准值的与基准值交换位置

额~,还是用代码说话还是比较好一些吧~

 #!/usr/bin/env Python

 #冒泡排序法
def bubleSort(arr):
for k in range(len(arr)):
temp = arr[k] #临时值,用于交换
for j in range(k+1,len(arr)):
'''
若值比基准值小则将基准值与当前值交换位置
'''
if arr[j]<arr[k]:
temp=arr[k]
arr[k]=arr[j]
arr[j]=temp
continue; #这里可有可无 i=[23,1,6,77,8,-11,100,11.1,99,24,21] print ("排序前")
print (i)
print ("排序后")
bubleSort(i)
print (i) ==========控制台输出============
排序前
[23, 1, 6, 77, 8, -11, 100, 11.1, 99, 24, 21]
排序后
[-11, 1, 6, 8, 11.1, 21, 23, 24, 77, 99, 100]

既然是Python,当然Python中对于数组也内置了一键排序算法:

 ii=[23,1,6,77,8,-11,100,11.1,99,24,21]
ii.sort() #数组内置sort方法排序
print ("ii",ii)
ij=[23,1,6,77,8,-11,100,11.1,99,24,21]
ij=sorted(ij) #外部方法排序(相当于工具类)
print ("ij",ij)

既然Python已经提供了排序方法,还要白忙活一气,是不是很悲伤

Python之排序算法:快速排序与冒泡排序的更多相关文章

  1. Python实现排序算法之快速排序

    Python实现排序算法:快速排序.冒泡排序.插入排序.选择排序.堆排序.归并排序和希尔排序 Python实现快速排序 原理 首先选取任意一个数据(通常选取数组的第一个数)作为关键数据,然后将所有比它 ...

  2. python实现排序算法 时间复杂度、稳定性分析 冒泡排序、选择排序、插入排序、希尔排序

    说到排序算法,就不得不提时间复杂度和稳定性! 其实一直对稳定性不是很理解,今天研究python实现排序算法的时候突然有了新的体会,一定要记录下来 稳定性: 稳定性指的是 当排序碰到两个相等数的时候,他 ...

  3. python常见排序算法解析

    python——常见排序算法解析   算法是程序员的灵魂. 下面的博文是我整理的感觉还不错的算法实现 原理的理解是最重要的,我会常回来看看,并坚持每天刷leetcode 本篇主要实现九(八)大排序算法 ...

  4. 第四百一十五节,python常用排序算法学习

    第四百一十五节,python常用排序算法学习 常用排序 名称 复杂度 说明 备注 冒泡排序Bubble Sort O(N*N) 将待排序的元素看作是竖着排列的“气泡”,较小的元素比较轻,从而要往上浮 ...

  5. python 经典排序算法

    python 经典排序算法 排序算法可以分为内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存.常见的内部排序算 ...

  6. JavaScript 排序算法——快速排序

    常见排序 javaScript 实现的常见排序算法有:冒泡排序.选择排序.插入排序.谢尔排序.快速排序(递归).快速排序(堆栈).归并排序.堆排序. 过程 "快速排序"的思想很简单 ...

  7. Python经典排序算法

    https://www.cnblogs.com/onepixel/p/7674659.html这个文章很nice https://www.bilibili.com/video/av685670?fro ...

  8. 数据结构和算法(Golang实现)(25)排序算法-快速排序

    快速排序 快速排序是一种分治策略的排序算法,是由英国计算机科学家Tony Hoare发明的, 该算法被发布在1961年的Communications of the ACM 国际计算机学会月刊. 注:A ...

  9. 《Java算法》排序算法-快速排序

    排序算法-快速排序: /** * 给定一个数组:按照从小到大排序. * 思路: * 1. 获取第一个数放入临时变量data,将大于data的数放右边,小于data的数放在左边. * 2. data左边 ...

随机推荐

  1. 晒下我在2017年所阅读的JavaScript书单

    前言 学习是一个持续不断的过程,在互联网技术里畅游的程序猿们,对学习的渴望更是难以穷尽.2017即将逝去,2018已经漏出曙光,回顾这一年,在学习的路上收获还是颇丰的,下面就晒一晒2017年我所学习的 ...

  2. node.js stream

    stream是一个接口,流是可以从一个读取或写入数据的目标对象 ,Node 中有很多对象实现了这个接口   一.nodejs stream类型 1. Readable - 可读操作. Writable ...

  3. df 命令详解

    一.df  作用:  显示磁盘分区上的可使用的磁盘空间, 默认显示单位为kb . 可以利用该命令来获取硬盘被占用了多少空间,目前还剩下多少空间的等信息. 选项: -a :包含全部的文件系统 -h :以 ...

  4. 解决openssh漏洞,升级openssh版本

    关于解决漏洞的问题我就不详说了,主要就是升级版本.这里我们就直接简单记录下步骤: 1.升级 使用root用户登录系统进入到/home/guankong ,上传openssh-6.6p1.tar.gz到 ...

  5. Unable to make the module: related gradle configuration was not found. Please, re-import the Gradle project and try again

    到stack overflow找到的答案,老外还是专业 I also had a similar problem, Go to : View -> Tool Windows -> Grad ...

  6. Volatile的作用

    众所周知,volatile关键字可以让线程的修改立刻通知其他的线程,从而达到数据一致的作用.那么它具体涉及到哪些内容呢? 关于缓存 计算机最大的存储空间就是磁盘(硬盘),但是访问的速度也是最慢的,价格 ...

  7. JQ 为未来元素添加事件处理器—事件委托

    随着DOM结构的复杂化和Ajax等动态脚本技术的运用,有了较多的动态添加进来的元素,直接用JQ添加click事件会发现新添加进来的元素并不能直接选取到,在这里就需要用到事件委托方法,JQ为事件委托提供 ...

  8. 3D轮播切换特效 源码

    这个3D轮播切换特效是我2017年2月份写的 当初我 刚接触HTML不久,现在把源码分享给大家 源码的注释超级清楚 . <!-- 声明文档类型:html 作用:符合w3c统一标准规范 每个浏览器 ...

  9. Life in Changsha 第一次scrum冲刺

    第一次冲刺任务 基于大局的全面性功能框架定位,要求能实现用户基于自己的需求进行的一系列操作. 用户故事 用户打开“生活在长大”的界面 程序首页展示校园服务,论坛等相关信息 用户选择某个功能 程序界面跳 ...

  10. jquery.cookie的path坑

    在使用jquery.cookie设置cookie的时候,通常都是直接设置,没有针对path,domain和expires等进行具体的设置,这会导致,同一个cookie的key对应多个value. 1. ...