python快速排序代码_Python与快速排序

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

注:转载请说明出处

问题提出:

将以下数据升序排列:5, 2, 8, 6, 4, 9, 7, 3, 1

快速排序的原理:

快速排序的核心思想是(如下图)

1.先确定一个基准数,让后按照比较规则,如本例是升序排列,则将比基数大的放到右边,比基数小的放到左边。

2.接下来各边重复步骤1,直到全部排序完毕。

735729-20160818004337921-1499937255.png

程序设计的思路就是(以上面的问题为例)

左右分别遍历比较

1 #非程序代码,只用来讲解

2

3 a = [5,2,8,6,4,9,7,3,1] #数据

4 temp #用于保存基数

5 left #左起点

6 right #右起点

7 i #左游标

8 j #右游标

1.将第一个数作为基数,temp=a[left], 初始化两个游标 i=left;j=right,(当left大于right时,分类结束)。

2.先由右边 j 开始遍历(必须要先从右边开始遍历,想想为什么,后面会解答),当遇到比基数小的停下;

然后左边 i 开始遍历,当遇到比基数大的数停下,当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步。

1 #!/usr/bin/env python

2 #-*- coding:utf8 -*-

3 '''

4 简介:本程序主要是用python实现快速排序,程序的功能是实现5 升序排列。6 本程序在数据量大的情况下,需要注意递归深度的问题。7

8 作者:King 日期:2016/08/01 版本19 '''

10

11 classQuickSort(object):12 '''

13 self.datas: 要排序的数据列表14 _sort(): 排序函数15 show(): 输出结果函数16

17 用法:18 QuickSort(datas) 实例化一个排序对象19

20 QuickSort(datas)._sort(left, right)21 开始排序,由于排序直接操作22 self.datas, 所以排序结果也23 保存在self.datas中, left为24 排序的开始位置,right为排25 序的结束位置。因此可以实现26 局部排序27

28 QuickSort(datas).show() 输出结果29 '''

30 def __init__(self, datas):31 self.datas =datas32

33 def_sort(self, left, right):34 #排序函数,由两个游标分别从两端开始遍历

35 #左端数据要比基数小,所以判断条件是遇到

36 #比基数大的就要停下。

37 #右端的情况与左端相反。

38 #39 #注意:程序一定要先从右端开始遍历,因为

40 #两端遍历最终停下的条件肯定是相遇

41 #的时候,如果左端先移动,则最后停

42 #下时的数值肯定比基数大,若将这个

43 #数字与基数交换,则基数左边的数字

44 #就不是全部比基数小了,程序运行就

45 #不正确了。

46 if(left >right):47 return

48 temp =self.datas[left]49 i =left50 j =right51 while i !=j:52 while(self.datas[j] >= temp and i

54

55 while(self.datas[i] <= temp and i

57

58 if i

735729-20160729180739856-1369420391.jpg

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值