赞
踩
python实现
A为输入的数组,begin与end是指向当前小数组头尾
min是最小值,minlist是保存对应最小值位置的数组
逻辑过程:(参考文末分治排序过程图,懒得专门画图了)
1.先把输入一次一次二分成为最小的问题(子数组),见代码中段递归调用自己
2.最小的问题是子数组只有一个元素,每个单个作为最小值和记录它位置的list,见代码前段终止条件及操作,但是A【begin】==min可能是多余操作,应该不会执行。
3.一层层合并,比对最小值,选小的返回给上一层,一样就把list合并,见代码后段。
可以设全局count记录basic operation次数
# count = 0 def find_mins(A,begin,end,min,minlist): '''设值结束情况,即分问题只有一个数字的情况''' if begin == end: if A[begin]< min: min = A[begin] minlist = [begin] elif A[begin]==min: minlist.append(begin) return min,minlist '''递归调用自己,分割问题,传递子问题所在子数组在原数组的的左右边界, 后面两个用来记录当前情况,用户合并。''' tempmin1, tempminlist1 = find_mins(A,begin,int((begin+end)/2),min,minlist) tempmin2, tempminlist2 = find_mins(A,int((begin+end)/2+1),end,min,minlist) # global count # count=count+1 '''归并,一层层把子问题的结果比较并且合并''' if tempmin1 < tempmin2: return tempmin1, tempminlist1 elif tempmin1 > tempmin2: return tempmin2, tempminlist2 elif tempmin1 == tempmin2: minlist = tempminlist1+tempminlist2 return tempmin1, minlist '''示例''' A = [12,4,3125,21,100,5435,66,454,4,8,8,8,4] min,minlist = find_mins(A,0,len(A)-1,100000,[]) print(str(min)) print(minlist)
输入数组:
[12,4,3125,21,100,5435,66,454,4,8,8,8,4]
运行结果,显示最小值以及所有其所在的位置:
4
[1, 8, 12]
参考分治排序思想:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。