#类似哈夫曼树的构成规则的思路,将小的元素放在一起,同大的相当
def split_array(arr, split_num):
#子数组和类节点,存储和值和子数组编号
class node:
def __init__(self,a,b):
self.num=a
self.idx=b
#小顶堆实现函数
def HeapAdjust(s, a, n):
temp = s[a]
i=a*2
while i <= n:
if (i < n and s[i].num> s[i + 1].num):
i+=1
if (temp.num <= s[i].num):
break
s[a] = s[i]
a = i
i *= 2
s[a] = temp
def HeapSort(s, n):
i = n // 2
while i >= 1:
HeapAdjust(s, i, n)
i-=1
if len(arr)<=split_num:
res=[[x] for x in arr]
for i in range(split_num-len(res)):
res.append([])
return res
res=[[] for i in range(split_num)]
arr.sort(reverse=True)
nums=[[node(-1,-1)]]#堆排序第一个元素占位
for idx in range(split_num):
res[idx].append(arr[idx])
nums.append(node(arr[idx],idx))
HeapSort(nums,len(nums)-1)
for item in arr[split_num:]:
top_id=nums[1].idx
res[top_id].append(item)
nums[1].num+=item
HeapAdjust(nums,1,len(nums)-1)
return res
split_num = 4
print(split_array([3,4,5,6,7,8,100,101,200,300,400,500], split_num))
将一个list中的值尽可能平均分成N份,使得每一份的值大致相同
最新推荐文章于 2024-05-30 11:43:13 发布