Python与快速排序
这个算法系列主要是自己学习算法过程中动手实践一下,写这个文章作为笔记和分享个人心得,如有错误请各位提出。
注:转载请说明出处
问题提出:
将以下数据升序排列:5, 2, 8, 6, 4, 9, 7, 3, 1
快速排序的原理:
快速排序的核心思想是(如下图)
1.先确定一个基准数,让后按照比较规则,如本例是升序排列,则将比基数大的放到右边,比基数小的放到左边。
2.接下来各边重复步骤1,直到全部排序完毕。

程序设计的思路就是(以上面的问题为例)
左右分别遍历比较
#非程序代码,只用来讲解 a = [5,2,8,6,4,9,7,3,1] #数据
temp #用于保存基数
left #左起点
right #右起点
i #左游标
j #右游标
1.将第一个数作为基数,temp=a[left], 初始化两个游标 i=left;j=right,(当left大于right时,分类结束)。
2.先由右边 j 开始遍历(必须要先从右边开始遍历,想想为什么,后面会解答),当遇到比基数小的停下;
然后左边 i 开始遍历,当遇到比基数大的数停下,当i<j时,交换i和j所在的数a[i], a[j] = a[j],a[i],
交换完成后,继续遍历直到 i 和 j 相遇。
3.当i 和 j 相遇,说明一次分类完成,注意此时要将基数和 i,j 相遇时所在的数交换。a[left], a[i]=a[i], a[left]
4.先处理基数左边的数字,设置左起点为left=left,右起点为right=i-1, 重复1到5步。
5.当左边的数字处理完成,再处理右边数字,设置左起点为了left=i+1, 右起点为right=right,重复1到5步。
接下来为python程序源码:(可以到github上下载https://github.com/DIGCreat/pythonAndAlgorithms.git)
#!/usr/bin/env python
# -*- coding:utf8 -*-
'''
简介:本程序主要是用python实现快速排序,程序的功能是实现
升序排列。
本程序在数据量大的情况下,需要注意递归深度的问题。 作者:King 日期:2016/08/01 版本1
''' class QuickSort(object):
'''
self.datas: 要排序的数据列表
_sort(): 排序函数
show(): 输出结果函数 用法:
QuickSort(datas) 实例化一个排序对象 QuickSort(datas)._sort(left, right)
开始排序,由于排序直接操作
self.datas, 所以排序结果也
保存在self.datas中, left为
排序的开始位置,right为排
序的结束位置。因此可以实现
局部排序 QuickSort(datas).show() 输出结果
'''
def __init__(self, datas):
self.datas = datas def _sort(self, left, right):
# 排序函数,由两个游标分别从两端开始遍历
# 左端数据要比基数小,所以判断条件是遇到
# 比基数大的就要停下。
# 右端的情况与左端相反。
#
# 注意:程序一定要先从右端开始遍历,因为
# 两端遍历最终停下的条件肯定是相遇
# 的时候,如果左端先移动,则最后停
# 下时的数值肯定比基数大,若将这个
# 数字与基数交换,则基数左边的数字
# 就不是全部比基数小了,程序运行就
# 不正确了。
if(left > right):
return
temp = self.datas[left]
i = left
j = right
while i != j:
while(self.datas[j] >= temp and i < j):
j -= 1 while(self.datas[i] <= temp and i < j):
i += 1 if i < j:
self.datas[i], self.datas[j] = \
self.datas[j], self.datas[i] self.datas[left], self.datas[i] = self.datas[i], temp self._sort(left, i-1)
self._sort(i+1, right) def show(self):
print 'Result is:',
for i in self.datas:
print i, print '' if __name__ == '__main__':
try:
datas = raw_input('Please input some number:')
datas = datas.split()
datas = [int(datas[i]) for i in range(len(datas))]
except Exception:
pass qs = QuickSort(datas)
qs._sort(0, len(datas)-1)
qs.show()
最后有兴趣的同学可以关注我的微信公众号,可以随时及时方便看我的文章。*^_^*
扫码关注或者搜索微信号:King_diary

Python与快速排序的更多相关文章
- python实现快速排序
最近在公司的工作内容发生变化,短期内工作量变少了,这也让我有时间整理一些日常学习和工作中的收获或思路.所以申请了博客,并打算持续更新. 快速排序采用了分治的思想,基本思想是选取数组中一个数为基准数(一 ...
- python 实现快速排序
一.快排思想 快速排序可以理解为是对冒泡排序的一种改进,把一组数,按照初始选定的标杆(参照数), 分别从两端开始排序,左端'i'只要小于标杆(参照数)的数,右端'j'只要大于标杆(参照数)的数, i- ...
- Python实现快速排序--数据结构
快速排序(Quick Sort) 快速排序是由东尼·霍尔所发展的一种排序算法.在平均状况下,排序n个元素要O(nlogn)次比较.在最坏状况下则需要O(n^2)次比较,但这种状况并不常见.事实上,快速 ...
- python实现快速排序算法
快速排序算法又称划分交换排序(partition-exchange sort),一种排序算法,最早由东尼·霍尔提出.在平均状况下, 排序n个项目要O(nlogn)次比较.在最坏状况下则需要O(n*2) ...
- $用python实现快速排序算法
本文主要介绍用python实现基本的快速排序算法,体会一下python的快排代码可以写得多么简洁. 1. 三言两语概括算法核心思想 先从待排序的数组中找出一个数作为基准数(取第一个数即可),然后将原来 ...
- 【python】快速排序
快速排序思想和C++的差不多,主要是通过写排序对python的语法更加了解. # 快速排序 def qsort(arr, left, right): if left >= right: retu ...
- python 实现快速排序和插入排序
def quick_sort(data): if len(data)<2 or (len(data)==2 and data[0]<=data[1]): #[2,3]此情况会死循环 所以加 ...
- python之快速排序
快速排序(Quicksort)是对冒泡排序的一种改进. 快速排序由C. A. R. Hoare在1962年提出.它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另 ...
- Python 双向链表 快速排序
1.创建链表: from random import randint class DLinkedNode(object): def __init__(self, data=None, pre=None ...
随机推荐
- Jenkins简单的使用
1.每个版本开发提单子,写清楚发布那个项目.配置文件.所执行SQL语句等:QA开始部署测试环境 2.如下时发布项目 一.版本发布 登陆系统,选择对应的项目(以api-gateway为例,如果找不到对应 ...
- 前端神器!!gulp livereload实现浏览器自动刷新
首先gulp是基于Node的,所以确保你已经安装 node.js,在Nodejs官方网站下载跟自己操作系统相对应的安装包. 先说一下gulp安装流程: 1:全局安装gulp,操作为: npm inst ...
- tomcat的localhost-config is missing 错误的解决方法
运行项目时报错,错误信息为: The tomcat server configuration at /sever/tomcat v7.0 localhost-config is missing 解决方 ...
- JVM原理一
简述: 这个其实不是很重要,一般配好环境就好了,如果不对jvm做啥动作不需要搞清楚这个. JVM ---->< JVM.DLL 挂接到JNIENV的实例 JAVA程序和操作系统的一个沟通者 ...
- Python:数据结构(list, tuple, Dict & Set)
list: Python中内置的有序数据结构,即数组.由于Python是动态语言,因此数组元素的类型没有限定. classmates = [“Michael”, “David”,”Bob”,”Trac ...
- erl_0017 《硝烟中的erlang》 读书笔记004 “锁和阻塞”
如果某个进程需要持续地接收新任务,那么其在执行耗时过长的锁或者阻塞操作时,就会出现问题. 最为常见的例子之一就是:某个进程使用了TCP socket,阻塞在了接收新的连接或者等待消息上面.在执行此类阻 ...
- 【2018.06.26NOIP模拟】T2号码bachelor 【数位DP】*
[2018.06.26NOIP模拟]T2号码bachelor 题目描述 Mike 正在在忙碌地发着各种各样的的短信.旁边的同学 Tom 注意到,Mike 发出短信的接收方手机号码似乎都满足着特别的性质 ...
- Android.mk用法详解
一.Android.mk介绍 Android.mk是Android提供的一种makefile文件,用来指定诸如编译生成so库名.引用的头文件目录.需要编译的.c/.cpp文件和.a静态库文件等.要掌握 ...
- MVC之前的那点事儿 ---- 系列文章
MVC之前的那点事儿系列,是笔者在2012年初阅读MVC3源码的时候整理的,主要讲述的是从HTTP请求道进入MVCHandler之前的内容,包括了原创,翻译,转载,整理等各类型文章,当然也参考了博客园 ...
- visibility:hidden和display:none的区别
大家知道,如果想让某一段代码在前台不显示,最简单的方法是用css的display:none即可,这样下边的内容就自动上移或右侧的左移来填补这个空隙. 但特殊情况下我们只需要隐藏这个元素,但它的位置不能 ...