python 数据结构与算法 day04 快速排序

1. 快速排序

思路:


快速排序是对原始的序列先找第一个元素应该放在原有序列的哪一个位置,需要有两个游标同时移动,首先从high开始移动,如果high所指的元素比第一个元素大,就继续移动high游标,直到遇到high 所指的元素比第一个要处理的元素值小,high就不再继续移动,把high所指位置的元素放到low位置上,接着立马移动low游标,判断low所指位置的元素是不是比第一个元素小,如果小就继续向右移动low游标,直到遇到low所指位置的元素比第一个元素大,low游标就不再继续移动,并且把low所指位置的元素放在原来high位置上,接着立马移动high游标,,,,一直重复这样的步骤,直到low high两个游标相遇,相遇的位置就是第一个元素应该在的合适位置

这样第一个位置的元素就已经被安排好了,接着以该元素为分割点,对原序列的左右两部分分别执行上述操作,也就是会不断分成小序列进行排序(但是需要注意都是在原有序列上操作的,只是操作的是原始序列的一小部分,所以最开始需要制定操作的是原有序列的first last部分)

2. 代码实现

def quick_sort(L,first,last):
    """快速排序,始终都是对原有列表进行操作的,first last用于指定从序列的那一部分进行排序"""
    low=first  # 每一次迭代都需要定义两个游标,low和high用于移动,找到子序列中第一个元素需要放在哪一个位置mid_value
    high=last
    mid_value=L[first]  # 每一次迭代都是针对原有序列的一小块,然后都是看这一小块子序列的头一个元素mid_value值应该放在哪个位置
    if first>=last:  # 递归调用停止的条件(注意这里不仅仅是== 需要>= 当有两个元素时,再进行拆分会有first>last的情况出现)
        return
    while low<high:
        while low<high and L[high]>=mid_value:  # 先让右边的游标high开始移动,如果high所指的元素确实比mid_value大,就继续移动high向左移动
            high-=1
        L[low]=L[high]  # 直到high所指位置的元素比mid_value小,high游标就不再移动,把high位置的元素赋值给low位置的元素(第一次就是0位置元素,因为原有元素已经被mid_value保存了,所以此次赋值是可以的)
        while low<high and L[low]<mid_value:  # 移动low游标时,当low位置元素比mid_value小时就继续往右移动
            low+=1
        L[high]=L[low]  # 否则就停止,把low位置的元素赋值给原来high位置
    L[low]=mid_value  # 最外层的while 循环停止(也就是low high指向同一个位置,该位置就是mid_value在序列中应该移动到的正确位置)至此第一个位置的元素已经被置于合适的位置
    quick_sort(L,first,low-1)  # 以low(high)位置为分割点,把原有序列分为两部分,使用递归执行同样的排序,也就是找到子序列的头一个元素应该放在哪一个位置
    quick_sort(L,low+1,last)

L=[4,1,9,3,6,0,8,2,7]
quick_sort(L,0,len(L)-1)
print(L)

运行结果:

3. 时间复杂度

快速排序最有时间复杂度是nlog(n) 因为横向来看 每一次找头一个元素应该放在序列中哪一个位置,需要移动low high两个游标,low从左往右 high从右往左,直至两者相遇 也就是走完n长度--所以横向复杂度O(n)

纵向就是这个过程执行了多少次,最开始是一个序列,然后不断地两个两个的划分,直到最后变成n个小的子序列(其实就是一个一个元素)所以2^k=n k代表的是分割的过程次数 k=logn

所以最优时间复杂度是nlog(n)

再来看最坏时间复杂度,就是O(n^2), 其实就是每次划分并没有把序列一分为二,这样纵向过程次数仍然是O(n)(最好的当然是一分为二 两部分都进行快速排序)最坏的就是每次仍然划分为一个序列(和一个空的)

这样的话就是O(N^2);

4. 稳定性

快速排序是不稳定的!!

因为快速排序涉及到跳过元素交换,有可能在移动时会把相同的元素在前面位置的,由于low的移动放在 后面元素的后面,(后面元素在high右边前面)

猜你喜欢

转载自www.cnblogs.com/xuanxuanlove/p/9942543.html