递归排序算法详情接上面快速排序。
当上面序列排序完毕之后,序列分成两部分,对左右序列进行相同的排序操作,可以认为就是递归操作。
就是对相同的快速排序算法执行多次。
对左部分继续调用quick_sort()排序,44会找到他正确的位置。
之后44会把他的左右两边分成两部分,44的左边为26,31,17,44的右边为空。
对于右边继续排序,会把77安放在他应该在的位置。77的左边为55,77的右边为93结果如下:
递归操作就是在函数内部再次利用该排序算法(再次调用该函数)进行排序操作。
之后26再找到他的合适位置,结果如下:
每次递归操作的时候都要把他的起始值和结束值传入进去,因为需要对同一个列表进行操作,但是当把列表分成两部分的时候,子列表的前后两部分的起始值和结束值不一样,因为后部分子列表的开始值下标不为0,结束值下标不为low-1,所以需要传入值来确定下标位置。
执行代码如下:
#递归排序
#first代表列表的起始部分,last代表列表的结束部分,第一次传入的时
#候是整个大列表,但是当第二次传入的时候就是分成前后两部分的分列表。
#第三次会再次进行分割传入。
def quick_sort(alist,first,last):
#下面设置递归排序的结束条件,当满足下面条件的时候就会退出,下面条件的意思是,子序列排序完后不需要再排
if first>=last:
return
mid_value = alist[first] # mid_value的值为传入的第一个值,即子部分的第一个值。
low = first # 传入列表子部分的起始值为传入的起始值。
high = last # 传入列表子部分的结束值为传入的结束值。
while low<high:
while low < high and alist[high] >= mid_value: # 在low<high并且high所指位置元素比mid_value大的情况下,让high往左移动
high -= 1
alist[low]=alist[high]
#之后就应该执行low的操作
while low<high and alist[low]<mid_value: #当low小于high,并且low位置所指的元素比mid_value小的话low就继续往右移动
low+=1
alist[high]=alist[low]
alist[low]=mid_value
#下面是递归排序的主要代码
#对low左边的列表进行排序
#调用函数自身的时候,因为左右两端的起始值不都为0,结束值不都为len(alist),所以在下面会分成两部分操作
quick_sort(alist,first,low-1)
#对low右边的列表进行排序。
quick_sort(alist,low+1,last)
if __name__ == '__main__':
alist = [54, 26, 93, 17, 77, 31, 44, 55, 20]
print(alist)
quick_sort(alist,0,len(alist)-1)
print(alist)
整个序列对半折分,进行的时间复杂度为为:O(nlogn),最坏时间复杂度为:O(n的平方),稳定性为:不稳定