part1 基于分治策略的快速排序及其衍生算法

目录

1.算法设计

2.伪代码

3.算法复杂性分析

(1)时间复杂性:

(2)空间复杂性:

4.代码截图和运行结果截图

5.总结

(1)分治快排是一种常用的排序算法,它通过一个大问题分解为多个小问题, 并通过递归的方式解决这些小问题,最终得到整体的解决方案。

(2)一些常见的应用场景可以使用分治法解决问题:


1.算法设计

(1)快速排序的分治策略

①划分:选定一个记录作为轴值,以轴值为基准将整个序列划分为两个子序列 r1 , … , ri-1 和 ri+1 , … , rn,前一个子序列中记录的值均小于或等于轴值,后一个子序列中记录的值均大于或等于轴值;

②求解子问题:分别对划分后的每一个子序列递归处理;

③合并:由于对子序列 r1 … ri-1 和 ri+1 … rn 的排序是就地进行的,所 以合并不需要执行任何操作。

(2)选择的数据结构是数组。由于快速排序是基于比较的排序算法,数组提供了随机访问元素的能力,使得我们可以在常数时间内访问任意位置的元素。这对于快速排序中的分割操作非常重要。

想要进一步了解分治法的宝宝可以看我发布的另一篇博客:

分治法的基本思想及步骤icon-default.png?t=N7T8https://blog.csdn.net/a1b2c3666666/article/details/138425914?spm=1001.2014.3001.5501

2.伪代码

QuickSort(a,low,high)

        if low < high

                then pivot = partition(a,low,high)

                QuickSort(a,low,pivot -1)

                QuickSort(a,pivot +1,high)

3.算法复杂性分析

(1)时间复杂性:

①平均情况下,快速排序的时间复杂性为 O(nlogn),其中 n 是待排序元素的数量。

②最坏情况下,当输入数组已经有序或近乎有序时,快速排序的时间复杂性为 O(n^2)。

③最好情况下,当每次划分都能将数组均匀地分成两部分时,快速排序的时间复杂性为 O(nlogn)。

(2)空间复杂性:

快速排序的空间复杂性主要取决于递归调用栈的深度,即递归过程中所使用的额外空间。

①在最坏情况下,递归调用栈的深度为 O(n),因此空间复杂性为 O(n)。

②在平均情况下,递归调用栈的深度为 O(logn),因此空间复杂性为 O(logn)。

4.代码截图和运行结果截图

完整代码:

def quick_sort(arr):
    if len(arr) <= 1:
        return arr
    pivot = arr[len(arr) // 2]
    left = [x for x in arr if x < pivot]
    middle = [x for x in arr if x == pivot]
    right = [x for x in arr if x > pivot]
    return quick_sort(left) + middle + quick_sort(right)

arr = [3,6,8,10,1,2,1]
print(quick_sort(arr))

5.总结

(1)分治快排是一种常用的排序算法,它通过一个大问题分解为多个小问题, 并通过递归的方式解决这些小问题,最终得到整体的解决方案。
(2)一些常见的应用场景可以使用分治法解决问题:

        1)排序算法:例如归并排序和快速排序都是基于分治法的思想实现的。它 们将待排序的数组分解成较小的子数组,分别进行排序,然后再将排好序的 子数组合并起来。

        2)查找问题:例如二分查找算法就是一种基于分治法的查找算法。它将待 查找的有序数组分成两部分,通过比较中间元素与目标元素的大小关系,确 定目标元素在哪一部分,然后递归地在该部分中进行查找。

        3)求解最大子数组和:给定一个整数数组,求解其中连续子数组的最大和。 可以使用分治法将数组分成两部分,分别求解左半部分的最大子数组和、右 半部分的最大子数组和以及跨越中间位置的最大子数组和,然后取三者中的 最大值作为结果。

        4) 矩阵乘法:矩阵乘法可以使用分治法进行优化。将两个大矩阵分解成若 干个子矩阵,然后递归地进行矩阵乘法运算,并将子矩阵的结果合并起来得 到最终的乘积矩阵。

        5)求解最近点对问题:给定平面上的一组点,求解其中距离最近的两个点。 可以使用分治法将点集分成两部分,分别求解左半部分和右半部分的最近点对,然后再考虑跨越中间位置的最近点对。

可以给我一个免费的赞赞嘛~拜托啦ovo蟹蟹~

我的算法专栏会持续更新哒~

  • 25
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值