快速排序与Python实现

快速排序又叫Quick Sort,基本思想是一次循环把列表分成两部分,左边部分为小(默认),右边部分为大。然后递归调用,对左右部分继续下去,直到一个部分只有一个元素。

Python实现:

# 归位函数

defpartition(data, left, right): # 左右分别指向两端的元素

    tmp = data[left] # 把左边第一个元素赋值给tmp,此时left指向空

    while left < right: # 左右两个指针不重合,就继续

        while left < right and data[right]>= tmp: # right指向的元素大于tmp,则不交换

            right -= 1 # right 向左移动一位

       data[left] = data[right] # 如果right指向的元素小于tmp,就放到左边现在为空的位置

        while left < right and data[left]<= tmp: # 如果left指向的元素小于tmp,则不交换

            left += 1 # left向右移动一位

        data[right] = data[left] # 如果left指向的元素大于tmp,就交换到右边

    data[left] = tmp # 最后把最开始拿出来的那个值,放到左右重合的那个位置

    return left # 最后返回这个位置

 

# 写好归位函数后,就可以递归调用这个函数,实现排序

defquick_sort(data, left, right):

    if left < right:

        mid = partition(data, left, right) # 找到指定元素的位置

        quick_sort(data, left, mid - 1) # 对左边元素排序

        quick_sort(data, mid + 1, right) # 对右边元素排序

    return data

 

最差时间复杂度为O(n^2)(此时每次极端分,也就是一边一个,另一边n-1个),最优时间复杂度为O(nlogn)(此时正好二分),平均时间复杂度为O(nlogn)(此时采用概率理论,每次平均分到1/4处,左右1/4是等价的)。

如有不足或错误请指正。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值