快速排序讲解
快速选取一个元素作为基准值(一般是选中数组中的第一个元素)将大于该基准值的元素放在数组的右边,小于基准值的元素放在数组的左边,此时完成一次排序,多次按照既定规则循环后完成排序。
(1)优先设置两个边路i和j,设置元素位置i=0,j=len(array)-1;
(2)选取第一个元素作为基准值,即base=array[i]
(3)j开始向左移动,每次移动一个元素,即j-=1,直到该元素小于基准值时停下,此时将该值赋值给array[i] 即array[i]=array[j];
(4)i开始向右移动,每次移动一个元素,即i+=1,直到该元素大于基准值时停下,此时将该值赋值给array[j],即array[j]=array[i]
(5)重复执行3/4两个步骤,直到i=j时停下,此时找到了基准的位置,即array[i]=base,到此也就是完成了一次排序。
(6)通过第一轮排序后,基准值左边的比其小,右边的比其大。然后通过递归的方式继续执行前后两半区实现最终排序。
代码实现:
def quick_sort(lis,start,end):
# 判断start是否小于end,如果为false,直接返回
if start < end:
i,j=start,end
base=lis[i]
while i < j:
# 如果列表后边的数比基准数要大,那么基准数向前移动一位
while (i<j) and (lis[j] >= base):
j = j-1
# 否则的话,就与基准数相互交换
lis[i]=lis[j]
while (i<j) and (lis[i]<=base):
i += 1
lis[j]=lis[i]
# 做完第一轮比较后,列表被分为了两个半区,并且i=j,此时找到基准值的位置
lis[i]=base
# 递归前后半区
print(lis)
quick_sort(lis,start,i-1)
quick_sort(lis,j+1,end)
return lis
lis= [7, 6, 5, 3, 12, 20, 1, 9, 11, 4, 15, 10, 8]
print(quick_sort(lis,0,len(lis)-1))
另外一种,找中间为基准
代码实现:
def quick_sort(lis):
if len(lis)>=2:
# 选取基准值
pivot=lis[0]
# 定义基准值左右两侧的列表
left,right=[],[]
# 从原始数组中移除基准值
lis.remove(pivot)
for n in lis:
if n >= pivot:
right.append(n)
else:
left.append(n)
return quick_sort(left)+[pivot]+quick_sort(right)
else:
return lis
lis= [7, 6, 5, 3, 12, 20, 1, 9, 11, 4, 15, 10, 8]
print(quick_sort(lis))