快速排序在数组有序和无序情况下的时间复杂度

快速排序有两点要注意:
一、partition分区算法的选择:

  1. 简单分区算法:选择一个基数,遍历数组元素和基数比较,如果元素nums[left]比基数大,就和数组nums[right]交换,right–,如果元素nums[left]比基数小,left++
  2. 双指针分区算法:从left和right分别定义一个指针,如果元素nums[left]比基数大,暂停遍历,如果元素nums[left]比基数小,left++;如果元素nums[right]比基数小,暂停遍历,如果元素nums[right]比基数大,right–;两边都暂停后互相交换元素,之后继续遍历,直到left和right指针相遇
    二、基数的选择:随意选择区间内任何一个数字做基数都可以。有两种选择方式:
  3. 选择第一个元素或者最后一个元素作为基数
  4. 选择区间内一个随机元素作为基数
    第二种选择方式的平均时间复杂度是最优的,一般为O(nlogn),第一种在数组基本有序的情况下容易造成一边倒的结果,算法效率不高,时间复杂度为O(n^2)
    相关算法题:leetcode-912
func quickSort(nums []int,start,end int){
   
    if start>=end{
   
        return
    }
    mid:=partition(nums,start,end)
    quickSort(nums,start,mid-1)
    quickSort(nums,mid+1,end)
}

简单分区算法

使用数组第一个元素作为基数pivot(leetcode结果大概为70-90ms)

func partition(nums []int,start,end int)int{
   
    pivot:=nums[start]//使用数组第一个元素作为基数
    left:=start+1
    right:=end
    for left<right{
   
        if nums[left]>pivot{
   
            nums[left],nums[right]=nums[right],nums[left]
            right--
        }else{
   
            left++
        }
    }
    if nums[left]>pivot{
   
        nums[left-1],nums[start]=nums[start],nums[left-1]
        return left-1
    }else{
   
        nums[left],nums[start]=nums[start],nums[left]
        return left
    }
}

使用数组中间元素作为基数pivot(leetcode结果大概为40-50ms)

func partition(nums []int,start,end int)int{
   
    pivot:=nums[start+(end-start
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值