D&C的重要算法之一–快排
快速排序使用分而治之的策略
分而治之divide and conquer
快速排序是一种排序算法,他的速度要优于选择排序,而且是优雅代码典范之一
经典的一个问题是在1680M*640M的土地上,均匀分成方块。且分出的方块要尽可能的大
适用于这小块地的最大方块,也是适用于整块地的最大方块
欧几里得算法,待研究一下
https://www.khanacademy.org/computing/computer-science/cryptography/modarithmetic/a/the-euclidean-algorithm
D&C的工作原理
1.找出基线条件
2.确定如何缩小问题的规模,使其符合基线条件
1、求和数组的和,使用递归
def AddArray(nums):
if nums==[ ]:
return 0
return nums[0] + AddArray(nums[1:])
print(AddArray([1,3,5]))
结果:
9
2、找出数组中最大的数
def BigNumber(nums):
if len(nums)== 2:
return nums[0] if nums[0]>nums[1] else nums[1]
sub_max = BigNumber(nums[1:])
return nums[0] if nums[0] > sub_max else sub_max
print(BigNumber([3,2,9,1,1]))
结果:
9
3、快排的工作原理
1.首先选择一个元素为基准值pivot
2.找出比基准值小的元素和比基准值大的元素,这个可以叫做分区。
–>所有小于基准值的数字组成的子数组,无序的
–>基准值
–>一个由所有大于基准值的数字组成的子数组,无序的
如果子数组是有序的,直接把数组相加结果为有序数组
3.对两个子数组进行快速排序
def quicksort(arr):
if len(arr) < 2:
return arr
else:
pivot = arr[0]
less = [i for i in arr[1:] if i <= pivot]
great = [i for i in arr[1:] if i > pivot]
return quicksort(less) + [pivot] + quicksort(great)
print(quicksort([3,1,9,5,3]))
结果如下:
[1, 3, 3, 5, 9]
生命不息,学习不止,欢迎大佬们随时分享和给与建议