什么是快速排序?
快速排序是一种比较“中庸”的排序方法,它在最好和最坏的情况下的时间复杂度都比较可观。因此,当我们遇到一串数据,不知道用那种排序方法比较合适的时候,可以先用快速排序解决一下问题。甚至,在学会快速排序的算法和代码之后,我们可以把代码背下来,以备不时之需。
如何理解快速排序?
在一串有序的数列中,我们总能找到一个处于中间或类似中间位置的数,在这个数一边的数比它大,另一边的数比它小。那么,在对无序数组排序的时候,我们能否找到这样的一个数,调整另外的数,让比它小的数居于一边,比它大的数居于一边,这样不就能达到排序的目的了吗?这就是快速排序的思想。
我们来举个栗子 对[9, 11, 6, 7, 1]这个数列进行排序,使用快速排序算法是什么样子呢
我们通常选择数列中第一个值或最后一个值作为他的中间值,那么我们从前往后开始遍历数列,这里我们还要引用标记的概念,这里可以理解成一个箭头箭头指向我们列表中的一个数字下面我们将以=代替箭头指向 i 代替箭头
[9, 11, 6, 7, 1] 这里我们第一个数字也就是中间数为9我们此时从9的前面的一个数字开始遍历 因为我们选的中间值在每次循环的过程中只会进行一次交换,交换后数列将以中间值进行分割左边小于右边大于,刚开始我们的 (i —>9)但是这里9大于6所以他们交换,我们所标记的数字也要往前一位指向数字6
[9, 6, 11, 7, 1] (i —>6)9>7
[9, 6, 7, 11, 1](i —>7)9>1
[9, 6, 7, 1, 11](i —>1)这里要注意11不能再进行比较了这是我们的9可以和标记进行交换位置了
[1, 6, 7, 9, 11]数据走到这里我们可以看到原来的数据被我们的9分成了两组【1,6,7,】【11】我们依旧按照上述办法去校验这两个数列从而对元素顺序进行排序得到我们的最终数列
[1, 6, 7, 9, 11]
[1, 6, 7, 9, 11]
[1, 6, 7, 9, 11]
[1, 6, 7, 9, 11]
[1, 6, 7, 9, 11]
快速排序的python实现
lista= [9, 11, 6, 7, 1]
"""
参数:1st:要被排序的数列,left:我们选取的中间值位置也是数列中的起始位置,right:数列中的最后一个值的位置,position数列中的标记位,div用来保存中间值,a用来保存起始位置
"""
def quickSort(lst,left,right):
a=left
div = lst[a]
position=a
for i in range(left+1,right+1):#从数列中第二个元素开始遍历列表
if lst[i] > div:#判断元是否大于中间值
pass
else:
position += 1#标记位进位
lst[i], lst[position] = lst[position], lst[i]#将大的数忘标记位后面移动
print(lst)
lst[left], lst[position] = lst[position], lst[left]#交换标记位和中间值所在位置
# position = position - 1
print(lst)
return position
pass
def quickSort2(lst, left, right):
if left >=right:#调用结束的判断条件,无法对数列进行分割
return
position = quickSort(lst, left, right)
quickSort2(lst, left, position-1)
quickSort2(lst, position + 1, right)
#递归调用对数列进行分割快速排序
pass
quickSort2(lista, 0, len(lista)-1)