目录
17-快速排序原理介绍
思路:
18-快速排序代码实现
19-快速排序代码实现2
缺点:
递归的限度:
17-快速排序原理介绍
思路:
--先找一个变量把 5(第一个数) 存起来,
(两个箭头分别是left , right)
--左边有一个空位, 发现左边的位置是给比5小的值准备的.
--找比5小的值放到左边, 从右边开始找. 8 9 2放左边,右边出现空位,
--从左边找比5大的数, 7放右边
-->左边出现空位,从右边箭头找, 1 比5小,放左边
-->右边出现空位, 从左边箭头找, 4 6比5大,放右边
-->左边出现空位, 3比5小,放左边
-->最后箭头重合, 结束.
18-快速排序代码实现
def partition(li,left,right): tmp = li[left] #取第一个元素tmp, 分成两部分(左边比tmp小,右边比tmp大). while left < right: while left < right and li[right] >= tmp: #从右找比tmp小的数, right -=1 #right一直往左走. li[left] = li[right] #循环完,交换对应的位置(找到的). # print(li,'right') while left < right and li[left] <= tmp: #从左找比tmp大的数: left +=1 #left向右走一步. li[right] = li[left] #循环完,交换对应的位置(找到的). li[left] = tmp #tmp最后归位,剩下的一个就是. # print(li,'left') return left #返回中间那个归位的元素. def quickSort(li,left,right): if left < right: mid = partition(li,left,right) #中间值,分成两部分,分别再排序. quickSort(li,left,mid-1) quickSort(li,mid+1,right) li = [5,7,4,6,3,1,2,9,8] print(li) quickSort(li,0,len(li)-1) # partition(li,0,len(li)-1) print(li)
19-快速排序代码实现2
(这里涉及到递归,不用通式判断)
函数里面有递归时,外面不要加装饰器,(否则会打印很多次)
import random import copy import time from test_time import * def partition(li,left,right): tmp = li[left] #取第一个元素tmp, 分成两部分(左边比tmp小,右边比tmp大). while left < right: while left < right and li[right] >= tmp: #从右找比tmp小的数, right -=1 #right一直往左走. li[left] = li[right] #循环完,交换对应的位置(找到的). # print(li,'right') while left < right and li[left] <= tmp: #从左找比tmp大的数: left +=1 #left向右走一步. li[right] = li[left] #循环完,交换对应的位置(找到的). li[left] = tmp #tmp最后归位,剩下的一个就是. # print(li,'left') return left #返回中间那个归位的元素. def _quickSort(li,left,right): if left < right: mid = partition(li,left,right) #中间值,分成两部分,分别再排序. _quickSort(li,left,mid-1) _quickSort(li,mid+1,right) @timeit def quickSort(li): _quickSort(li,0,len(li)-1) li = list(range(10000)) random.shuffle(li) li1=copy.deepcopy(li) quickSort(li1) #这里可以和其他排序比一下,快速排序速率很快.
缺点:
987654321
--9为第一个值
数据传倒序的
递归的限度:
import sys sys.setrecursionlimit(10000) #改完之后速率变慢了
改一下:随机找一个数与第一个交换.
--但还是有最坏情况.