快速排序

快速排序介绍

快速排序(Quick Sort)是通过分治的思想来进行排序。它的主要思想是:取数组中的一个数作为基准值(往往取数组中的第一个数),把所有小于基准值的数都放在它的左侧,再把所有大于基准值的数都放在它的右侧。随后,对基准值左右两侧的数组分别进行快速排序。

快速排序的平均时间复杂度是O(nlgn),最好情况下的时间复杂度是O()。最坏情况下,快速排序的时间复杂度可能退化为O(n^2),但这种情况很少见。快速排序是一个不稳定的算法,如果使用得当,快速排序的速度可以达到归并排序和堆排序的数倍,所以快速排序是一种极其常用的算法。

 

动图演示

 

快速排序

 

这动图看的可能不是那么直观,我建议可以看这片文章的解释,能够更好理解排序的过程(快速排序详细讲解

 

python代码

第一种实现方法:

1、取需要排序列表的第一个元素数值当做基准

2、创建3个空列表分别存放,比基准小的集合,与基准相等的集合,比基准大的集合,遍历除基准外所有元素数值与基准对比,将各个元素数值添加到对应列表中

3、接着对比基准小的集合列表,比基准大的集合重复进行上述操作,直到列表只剩一个元素或者为空后停止

4、将排序后的列表进行拼接

def QuickSort(num):
    #若数组长度为0,1,直接返回不用排序
    if len(num)<=1:
        return num
    #取数组第一个数值作为基准
    key = num[0]
    #定义空列表用来存储大于/小于/等于基准值的元素
    llist,mlist,rlist = [],[],[]
    #按key对每个元素进行比较,并存放如对应列表中
    for i in range(0,len(num)):
        if num[i] <key:
            llist.append(num[i])
        elif num[i] == key:
            mlist.append(num[i])
        elif num[i] >key:
            rlist.append(num[i])
    #递归,对左右两个列表再进行快排,拼接三个列表后返回
    return QuickSort(llist)+mlist+QuickSort(rlist)

nums = [5 ,1 ,2 ,6 ,9 ,3 ,4 ,7 ,10 ,8]
r = QuickSort(nums)
print(r)

以这种方法来实现快速排序需要额外的开辟空间给用于归类的列表。并且相似的思路用于其他的编程语言是效率低

 

第二种实现方法:

1、使用key来存放基准值(列表的第一个值),然后定义2个变量l,r来表示左右指针的位置

2、先移动右指针,找到一个比基准小的值,将这个值赋值给当前左指针指向的位置(还未移动,那么就是最左边)

3、开始移动左指针,找到一个比基准大的值,将这个值赋值给当前右指针所指向的位置 

4、循环反复直到左右指针指向同一个位置,将key值重新赋值到这个共同指向的位置,以这个位置为界限,比基准大的值都在右边,比基准小的值都在左边

5、现在左右两边也按照此步骤接着进行上述排序即可

def QuickSort(num,left,right):
    #如果左边界大于有边界直接退出
    if left>=right:
        return
    #l,r定义左右指针的位置,key为基准数值(默认列表开始的第一个元素为基准)
    l,r,key = left,right,num[left]
    #移动左右指针,与基准比较,小的放左区间,大的放右区间
    while l<r:
        #先从右指针开始向左移动,直到找到比基准小的数值,然后覆盖到左指针所指向的数值
        while l<r and num[r] >=key:
            r -=1
        #找到后覆盖到左指针指向的位置
        num[l] = num[r]
        #左指针开始向右移动,直到找到比基准大的数值,然后覆盖到右指针所指向的数值
        while l<r and num[l] <key:
            l +=1
        #找到后覆盖到右指针指向的位置
        num[r] = num[l]
        #现在所有比基准小的数值都在左边(称为左区间),比基准大的数值都在右边(称为右区间),且左右指针都指向中间位置
        #将基准key放到列表最中间(即左右指针现在指向的位置)
        num[l] = key
        #然后对现在的左右区间,进行相同的操作,直到排序结束
        QuickSort(num,left,l-1)
        QuickSort(num,l+1,right)
    return num

nums = [5 ,1 ,2 ,6 ,9 ,3 ,4 ,7 ,10 ,8]
r = QuickSort(nums,0,len(nums)-1)
print(r)

 

posted @ 2022-09-07 16:01  测试-13  阅读(189)  评论(0)    收藏  举报