常见面试题-排序算法-快速排序

排序思想:

  1. 在数列之中,选择一个元素作为”基准”(pivot),或者叫比较值。
  2. 数列中所有元素都和这个基准值进行比较,如果比基准值小就移到基准值的左边,如果比基准值大就移到基准值的右边
  3. 以基准值左右两边的子列作为新数列,不断重复第一步和第二步,直到所有子集只剩下一个元素为止。

特点:

  1. 稳定性:快排是一种不稳定排序,比如基准值的前后都存在与基准值相同的元素,那么相同值就会被放在一边,这样就打乱了之前的相对顺序
  2. 比较性:因为排序时元素之间需要比较,所以是比较排序
  3. 时间复杂度:快排的时间复杂度为O(nlogn)
  4. 空间复杂度:排序时需要另外申请空间,并且随着数列规模增大而增大,其复杂度为:O(nlogn)
  5. 归并排序与快排 :归并排序与快排两种排序思想都是分而治之,但是它们分解和合并的策略不一样:归并是从中间直接将数列分成两个,而快排是比较后将小的放左边大的放右边,所以在合并的时候归并排序还是需要将两个数列重新再次排序,而快排则是直接合并不再需要排序,所以快排比归并排序更高效一些,可以从示意图中比较二者之间的区别。
  6. 快速排序有一个缺点就是对于小规模的数据集性能不是很好。

 

时间复杂度的计算:

就平均情况而言,快速排序是目前被认为最好的一种内部排序方法,其时间复杂度在平均情况下是nlogn,在最坏的情况下(有序时)时间复杂度是o(n^2)。下面来分析时间复杂度的计算过程:

平均情况下:T(n)=2*T(n/2)+n;      第一次划分

                     =2*(2*T(n/4)+n/2)+n;     第二次划分

                     =2*(2*(2*T(n/8)+n/4)+n/2)+n;     第三次划分

                     =.....................

                     =2^m+m*n;  第m次划分

因为2^m=n,所以m=logn,所以T(n)=n+n*logn;       

PYTHON实现:

def quick_sort(arr):
    if len(arr) < 2:
        return arr
    # 选取一个基准值
    mid = arr[len(arr) // 2]
    arr.remove(mid)
    left = []
    right = []
    for item in arr:
        if item >= mid:
            # 大于等于基准值的放到右边
            right.append(item)
        else:
            # 小于基准值的放到左边
            left.append(item)
    # 递归的进行排序,并返回排序好的数组
    return quick_sort(left) + [mid] + quick_sort(right)


if __name__ == "__main__":
    arr = [1, 4, 2, 1, 5, 7, 98, 33, 1, 32, 2, 4, 6, 8]
    print(quick_sort(arr))

    # 不稳定
    # 1, 4, 2, 1, 5, 7, 1, 33, 1, 32, 4, 4, 6, 8
    # 选取第三个1作为基准,所有的1都会被放到right中,破坏了之前的相对顺序

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值