递归排序算法/排序算法总结

递归排序算法详情接上面快速排序。

当上面序列排序完毕之后,序列分成两部分,对左右序列进行相同的排序操作,可以认为就是递归操作。

就是对相同的快速排序算法执行多次。

对左部分继续调用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的平方),稳定性为:不稳定

猜你喜欢

转载自blog.csdn.net/qq_39112101/article/details/88625879