目录
(1)分治快排是一种常用的排序算法,它通过一个大问题分解为多个小问题, 并通过递归的方式解决这些小问题,最终得到整体的解决方案。
1.算法设计
(1)快速排序的分治策略
①划分:选定一个记录作为轴值,以轴值为基准将整个序列划分为两个子序列 r1 , … , ri-1 和 ri+1 , … , rn,前一个子序列中记录的值均小于或等于轴值,后一个子序列中记录的值均大于或等于轴值;
②求解子问题:分别对划分后的每一个子序列递归处理;
③合并:由于对子序列 r1 … ri-1 和 ri+1 … rn 的排序是就地进行的,所 以合并不需要执行任何操作。
(2)选择的数据结构是数组。由于快速排序是基于比较的排序算法,数组提供了随机访问元素的能力,使得我们可以在常数时间内访问任意位置的元素。这对于快速排序中的分割操作非常重要。
想要进一步了解分治法的宝宝可以看我发布的另一篇博客:
分治法的基本思想及步骤https://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蟹蟹~
我的算法专栏会持续更新哒~