这个算法系列主要是自己学习算法过程中动手实践一下,写这个文章作为笔记和分享个人心得,如有错误请各位提出。

注:转载请说明出处


问题提出:

将以下数据升序排列: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与快速排序的更多相关文章

  1. python实现快速排序

    最近在公司的工作内容发生变化,短期内工作量变少了,这也让我有时间整理一些日常学习和工作中的收获或思路.所以申请了博客,并打算持续更新. 快速排序采用了分治的思想,基本思想是选取数组中一个数为基准数(一 ...

  2. python 实现快速排序

    一.快排思想 快速排序可以理解为是对冒泡排序的一种改进,把一组数,按照初始选定的标杆(参照数), 分别从两端开始排序,左端'i'只要小于标杆(参照数)的数,右端'j'只要大于标杆(参照数)的数, i- ...

  3. Python实现快速排序--数据结构

    快速排序(Quick Sort) 快速排序是由东尼·霍尔所发展的一种排序算法.在平均状况下,排序n个元素要O(nlogn)次比较.在最坏状况下则需要O(n^2)次比较,但这种状况并不常见.事实上,快速 ...

  4. python实现快速排序算法

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

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

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

  6. 【python】快速排序

    快速排序思想和C++的差不多,主要是通过写排序对python的语法更加了解. # 快速排序 def qsort(arr, left, right): if left >= right: retu ...

  7. python 实现快速排序和插入排序

    def quick_sort(data): if len(data)<2 or (len(data)==2 and data[0]<=data[1]): #[2,3]此情况会死循环 所以加 ...

  8. python之快速排序

    快速排序(Quicksort)是对冒泡排序的一种改进. 快速排序由C. A. R. Hoare在1962年提出.它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另 ...

  9. Python 双向链表 快速排序

    1.创建链表: from random import randint class DLinkedNode(object): def __init__(self, data=None, pre=None ...

随机推荐

  1. 前端神器!!gulp livereload实现浏览器自动刷新

    首先gulp是基于Node的,所以确保你已经安装 node.js,在Nodejs官方网站下载跟自己操作系统相对应的安装包. 先说一下gulp安装流程: 1:全局安装gulp,操作为: npm inst ...

  2. 【商业源码】生日大放送-Newlife商业源码分享 -转

    http://www.cnblogs.com/asxinyu/p/3225179.html   今天是农历六月二十三,是@大石头的生日,记得每年生日都会有很劲爆的重量级源码送出,今天Newlife群和 ...

  3. 使用vue

    使用bootstrap npm install bootstrap@3 --save 使用jQuery npm install jQuery --save ---------------- 搭建vue ...

  4. Canvas 与 SVG 的区别

    这个说实话,我只用过canvas画过一些简单的图形,复杂的不懂,之所以列出来,是因为之前在面试中有被问到,在这里mark一下,后期深化. 以下的内容全部来自于w3school http://www.w ...

  5. 每天一个linux命令:【转载】rmdir命令

    今天学习一下linux中命令: rmdir命令.rmdir是常用的命令,该命令的功能是删除空目录,一个目录被删除之前必须是空的.(注意,rm - r dir命令可代替rmdir,但是有很大危险性.)删 ...

  6. sql中的一些函数(长期更新。。)

    前言 在最近看别人的sql的时候,看到一些函数,比如left(),right()等等,好奇是什么意思,查询之后觉得还是挺有用的,特此记录下来.博客会在遇到新的函数的时候定期更新. 正文 1. left ...

  7. UWP 流畅设计中的光照效果(容易的 RevealBorderBrush 和不那么容易的 RevealBackgroundBrush)

    在 Windows 10.0.16299 中,RevealBrush 被引入,可以实现炫酷的鼠标滑过高亮效果和点击光照.本文将告诉大家如何完整地实现这样的效果. Reveal 的效果(自带) 在微软官 ...

  8. 接口测试框架——第六篇-读Excel封装方法

    谢谢@小麦苹果的提醒,才发现我借口测试少写了一个文件,今天给大家补上: common->service->excel_case_data.py # coding: utf-8 import ...

  9. pipeline的存储代码

    在spider中最后一个函数返回item时会scrapy会调用pipeline里面的 process_item(self, item, spider):函数并传入item,spider等参数在这里可以 ...

  10. [BZOJ5329][SDOI2018]战略游戏

    bzoj luogu Description 省选临近,放飞自我的小Q无心刷题,于是怂恿小C和他一起颓废,玩起了一款战略游戏. 这款战略游戏的地图由n个城市以及m条连接这些城市的双向道路构成,并且从任 ...