问题:给出n个坐标表示n个点,并将这n个point排列在一条水平线上,要求挨个排序,最后达到 (x,y), (x+1, y), (x+2,y)……,求出移动的最少步数。
算法思想:分治算法+little中位数 (ps: 还未练习到中位数)
解题思路:要求排列成有序的一横排(默认为递增序列),可分步进行,根据复杂程度分为x和y两步,且先移动y坐标。先将每个point移至一水平线(存在2个或以上的点重合在一起的情况)。要求总的移动步数最少,则x轴和y轴的移动步数均为最少。故找出所有点y坐标的中位数,假设为y_middle, 则y=y_middle直线表示排序后的水平直线。x轴时,先进行一次排序后,假设水平线上的n个点存储在数组a[n]中,则第一个点a[0]最终排序后的位置是addr,a[1]的最终位置是(addr+1),a[2]的最终位置是(addr+2)……a[n]------->(addr+n)。分析则有:addr = a[0]-0 = a[1]-1 = a[2]-2 = ... = a[i]-i = ... = a[n]-n。故可将(a[i]-i)视为一个新的point,并将n各新的po