快速排序(python)

1.什么叫快速排序?
快速排序是对冒泡排序的改进,其实质是给基准数据找其正确索引位置的过程。
2.快速排序的实现步骤?
快排的主要思想是分治思想,将大问题分成小问题解决,主要有三步:

  1. 在数列中,选择一个元素作为基准(pivot),或者叫比较值:
  2. 将数列中所有元素与基准进行比较,比基准小的放基准的左边,比基准大的放基准的右边。
  3. 以基准值左右两边的子列作为新数列,不断重复第一步和第二步,直到所有子集只剩下一个元素为止。
    如下图所示:
    在这里插入图片描述
    3.快速排序是所有排序里面性能最好的吗?
    答:在数据规模越大快速排序的性能越优。快排在极端情况下会变成O(n2)复杂度的算法,如果每次选第一个数作为基准值,但每次这个数又是最小值,那么序列本身就是有序的,但时间复杂度是最高的。
    4.归并排序与快速排序那个更高效
    答:归并排序与快速排序都是分为之治思想,但是它们分解和合并的策略不一样:归并是从中间直接将数列分为两个,而快排是比较后将小的放在左边,大的放在右边;归并排序在合并的时候需要将两个数列再次进行对比排序,而快排则直接合并不再需要排序;所以快排比归并排序更高效一些。

5.快速排序有什么优点,有什么缺点?
答:快速排序的思想是分治思想,在处理大数据集时效果比较好,但是小数据集时候性能差些。当数据量较少时,比如数据量为10的时候,插入排序的速度比快速排序快,因为数据量较少时交换所消耗的资源占比大。

6.快排优化方案成立
答:对于大数据集排序先使用快排,使数据集达到基本有序,然后当分区达到一定小的时候使用插入排序,因为插入排序对少量的基本有序数据集性能由于快排!

快速排序的原始代码

def quick_sort(s, l, r):
    if l >= r:
        return
    # 列表的最后一个元素,s[l]作为基准值
    pivot = s[l]
    left = l
    right = r
    # 一轮循环,有可能,不能将所有的大数都放到基准值的右边,小数放到基准值的左边,所以直到left>right 跳出循环;
    while left < right:
        # 找寻右边数列比基准值小的数的位置
        while left < right and s[right] >= pivot:
            right -= 1
        # 此时有两种情况,第一种:left=right,下面操作可以说无意义;
        # 第二种:找到了s[right] >= pivot 且 left<right,意义将较大或相等的值放到左边的坑位
        s[left] = s[right]
        # 找寻左边数列比基准值大的数的位置
        while left < right and s[left] < pivot:
            left += 1
        #  此时有两种情况,第一种:left=right,下面操作可以说无意义;
        #  第二种:找到了s[right] < pivot 且 left<right,意义将较小的值放到右边的坑位
        s[right] = s[left]
        # 将大的数放在基准值的右边,小的数放在基准值的左边
    # while结束时候,left=right ,将基准值放到中间
    s[left] = pivot
    quick_sort(s, l, left-1)
    quick_sort(s, left+1, r)



if __name__ == '__main__':
    s = [9,8,6,7,4,3,99,5,3]
    quick_sort(s,0,len(s)-1)
    print(s)

# 稳定性:不稳定
# 最优时间复杂度:O(nlogn)
# 最坏时间复杂度:O(n^2)

参考
https://zhuanlan.zhihu.com/p/60731708
https://www.cnblogs.com/skywang12345/p/3596746.html
https://www.cnblogs.com/tianyadream/p/12456545.html
https://zhuanlan.zhihu.com/p/61800461
https://www.cnblogs.com/sfencs-hcy/p/10602598.html
https://blog.csdn.net/liangkaiping0525/article/details/82558188

  • 2
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
快速排序是一种基于分治思想的排序算法,它通过选择一个基准元素,将数组分为两部分,并使得左边的元素都小于等于基准元素,右边的元素都大于等于基准元素。然后递归地对左右两部分进行排序,最终得到一个有序数组。 以下是Python实现快速排序的代码: ```python def quick_sort(array, start, end): if start >= end: return mid_data, left, right = array[start], start, end while left < right: while array[right >= mid_data and left < right: right -= 1 array[left = array[right] while array[left < mid_data and left < right: left += 1 array[right = array[left] array[left = mid_data quick_sort(array, start, left-1) quick_sort(array, left+1, end) if __name__ == '__main__': array = [10, 17, 50, 7, 30, 24, 27, 45, 15, 5, 36, 21] quick_sort(array, 0, len(array)-1) print(array) ``` 快速排序的实现步骤如下: 1. 在数列中选择一个元素作为基准(pivot)。 2. 将数列中所有元素与基准进行比较,把比基准小的元素放在基准的左边,比基准大的元素放在基准的右边。 3. 以基准值左右两边的子列作为新数列,不断重复步骤1和步骤2,直到所有子集只剩下一个元素为止。 快速排序的优点是在处理大数据集时效果比较好,因为它采用了分治思想,可以充分利用计算资源。然而,快速排序在小数据集上的性能较差,因为交换元素的开销较大。另外,当选择的基准元素不合适或者数据已经有序时,快速排序的性能可能会变差。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值