1、快速排序的步骤理论
从数列中挑出一个元素,称为基准数;
重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分区退出之后,该基准就处于数列的中间位置。这个称为分区(partition)操作;
递归地把小于基准值元素的子数列和大于基准值元素的子数列排序;
2、学习插入排序先学习递归
递归要点
1、函数自己调用自己
2、有条件退出
计算n的阶乘,如10!=1×2×3…×9×10
1、0!=1
2、n! = (n-1)! * n
def f(n):
if n == 0: # 结束递归条件
return 1
else:
return f(n - 1) * n # 自己调用自己
3、快速排序一次的过程
数组 listx= [5, 56, 4, 7, 89, 6]
确认基数为最后一个数6
依次与前面的数比较,比较的次数 j 为 0-4
i 为下标左边的都是小于6的,包括下标i
用 j 和6去比较
1)如果大于6,则空过
2)如果小于6,i 加1,把 i 和 j 指向的元素交换位置
i=-1 j=0
5<6
i=0,
[5, 56, 4, 7, 89, 6]
i=0 j=1
56>6
空过 [5, 56, 4, 7, 89, 6]
i=0 j=2
4<6
i=1
i j 交换位置
[5, 4, 56, 7, 89, 6]
i=1 j=3
7>6
空过 [5, 4, 56, 7, 89, 6]
i=1 j=4
89>6
空过 [5, 4, 56, 7, 89, 6]
把下标 i + 1 和最后一个元素交换位置
[5, 4, 6, 7, 89, 56]
实现一次快速排序代码
def path_sort(lista, sIndex, eIndex):
i = sIndex-1
for j in range(sIndex, eIndex):
if lista[j] > lista[eIndex]:
pass
else:
i += 1
lista[i], lista[j] = lista[j], lista[i]
lista[i + 1], lista[eIndex] = lista[eIndex], lista[i + 1]
print(lista)
return i + 1 # 返回中位数下标
4、快排递归
1、对listx进行快排
2、对listx左列表5, 4进行快排,对listx右列表 7, 89, 56进行快排
3、直到列表只有一个元素时,则退出
def quickSort(listx):
def path_sort(lista, sIndex, eIndex):
i = sIndex-1
for j in range(sIndex, eIndex):
if lista[j] > lista[eIndex]:
pass
else:
i += 1
lista[i], lista[j] = lista[j], lista[i]
lista[i + 1], lista[eIndex] = lista[eIndex], lista[i + 1]
return i + 1
# 算法递归
def qSort(listb,sIndex,eIndex):
if sIndex >= eIndex: # 开始下标大于或等于结束下标,说明列表中只有一个元素,递归结束
return
middle = path_sort(listb,sIndex,eIndex)
# 左子列表递归排序
qSort(listb,sIndex,middle-1)
# 右子列表递归排序
qSort(listb,middle+1,eIndex)
# 调用递归函数
qSort(listx,0,len(listx)-1)
return listx
if __name__=="__main__":
print (quickSort([5, 4, 56, 7, 89, 6]))
执行结果