利用分治思想处理凸包问题。
划分:将点集S中的数据按横坐标排序,选出横坐标最小的点A和纵坐标最小的点B,AB的连线将S划分为两个子集,位于(AB) 上方的集合S1和位于(BA) 上方的集合S2。
递归求解:递归调用算法求S1的凸包和S2的凸包,递归算法中找出S1中使∆ABC面积最大的点C,则点C一定位于S1的凸包上,继续以点AC和CB作为连线划分S1。
合并:通过上述方法找到的凸包上的点直接合并,最后使用蛮力算法中的输出方法逆序输出点即可。
随机点集S生成部分与蛮力算法相同
分治算法中递归部分代码如下:
def dealleft(first,final,lis,temp):
#temp用来标记位于凸包上的点
max=0
index=-1
#处理first到final的上方,得到使first,final,i 三点组成的三角形面积最大的点i
if first<final:
for i in range(first,final):