整体思路是:
1.把要被分割的已知列表sort()排序,并求出它的元素的和的一半,以及最后一个元素的索引length
2.新建一个空列表
3.将半和与该列表的最后一枚元素依次比较。如果半和大,就把列表最后一个元素删除,添加到新列表中,half也减去这个元素的值;如果是最后一个元素大,就跳过该元素。无论哪一个大,length都要-1
4.自己给出需要排序的数组,进行测试
import math as dou
def doublesort(list):
half = dou.fsum(list) / 2
length = len(list) - 1
list1 = []
while(length>1):
if(half>list[length]):
list1.append(list[length])
half=half-list[length]
list.pop(length)
length-=1
else:
length-=1
continue
return list,list1
list=[9,10,14,18,21,32,43,8]
list.sort()
answer=doublesort(list)
print(answer)
print(sum(list),sum(answer[1]))
list=[160,512,488,356,159,444,520,521,233,333,390]
如图分组完毕,两组数据的差为170,可是列表中还存在着一枚159,将159从列表移到列表1,他们的差会更小。
问题出现 ---------》两组和之差:1956-1786=170
若是把 list 中 159移到 list1
两组之差会变成 |(1956-159)-(1786+159)| = |1797-1945| = 148
显然 上方代码错误
可能刚刚还觉得一个这种排序,用那么大的数排完全没有意义嘛。但是也正是因为这次百位数尝试,发现了这个bug。
再次修改:
import math as dou
def doublesort(list,length):
half=sum(list)/2
list1 = []
list1_sum=0
while(length>-1):
d_value = sum(list) - sum(list1)
if(half>=list[length]):
list1_sum+=list[length]
list1.append(list[length])
half-=list[length]
d_value=d_value-list[length]
list.pop(length)
length-=1
continue
else:
length-=1
continue
d_value = sum(list) - sum(list1)
if half < list[0] and d_value > list[0]:
list1.append(list[0])
list.pop(0)
return list, list1
list=[160,512,488,356,159,444,520,521,233,333,390]
list.sort()
length = len(list) - 1
answer=doublesort(list,length)
print(answer)
print('第一个数组的和为{0},第二个数组的和为{1}'.format(sum(list),sum(answer[1])))
结果如图
debug是真的有用呀…真不敢说自己用了两年codeblocks从来就没debug过。
代码丑陋的 1 p,臃肿的不行,已经被批评过了。
至于是否还存在bug 咱也不知道了…