python 将一个数组拆分成两个差值最小的数组

将一个数组拆分成两个差值最小的数组

整体思路是:

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]))

测试数据1

list=[9,10,14,18,21,32,43,8]
在这里插入图片描述

测试数据2

list=[9,7,6,4,8,5,2,3,1,7]
在这里插入图片描述

测试数据3

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 咱也不知道了…

  • 5
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值