有两个序列a, b,大小都为n,序列元素的值任意整型数,无序。 要求:通过交换a,b中的元素,使[序列a元素的和]与[序列b元素的和]之间的差最小

# 1.将两序列合并为一个序列,并排序,为序列Source
# 2.拿出最大元素Big,次大的元素Small
# 3.在余下的序列S[:-2]进行平分,得到序列max,min
# 4.将Small加到max序列,将Big加大min序列,重新计算新序列和,和大的为max,小的为min。
# Python代码
def mean(sorted_list):
    if not sorted_list:
        return(([],[]))
    big=sorted_list[-1]
    small=sorted_list[-2]
    big_list,small_list=mean(sorted_list[:-2])
    big_list.append(small)
    small_list.append(big)
    big_list_sum=sum(big_list)
    small_list_sum=sum(small_list)
    if big_list_sum>small_list_sum:
        return((big_list,small_list))
    else:
        return((small_list,big_list))
li=[5,5,9,9,1]
l =[4,7,7,8,5]
l.extend(li)
l.sort()
l1,l2=mean(l)
print( l1,l2)
print ('Distance:%s'%abs(sum(l1)-sum(l2)))
print ('-*'*40)
# 输出结果
# [4, 5, 5, 7, 9] [1, 5, 7, 8, 9]
# Distance:0


解题思路一:

1.列表合并排序,设两个空列表
2.最大值添加第一个列表
3.比较两个列表差,循环放入最小列表中

代码如下(Python2.7.5):

list1=[1,21,3,14]
list2=[8,4,5,7]
li=[]
lis3 = []
lis4 = []

for i in list1:
    li.append(i)
for i in list2:
    li.append(i)

li.sort()
sum1=sum(lis3)
sum2=sum(lis4)
i = len(li) - 1

while i >= 0 :
    if sum1>=sum2:
        lis4.append(li[i])
        sum2=sum(lis4)
    else:
        lis3.append(li[i])
        sum1=sum(lis3)
    i-=1
if sum1>=sum2:
    cha = sum1-sum2
else:
    cha = sum2-sum1

print lis3
print lis4
print sum1
print sum2
print cha


解题思路二:

假如最小数是负数,这样题目就很简单,代码如下:

li1=[1,21,3,14]
li2=[8,4,5,7]

sourcelist=[]

for i in li1:

        sourcelist.append(i)
for j in li2:
        sourcelist.append(j)
sourcelist.sort()
#python3,整数除法/会变浮点,是不是改//比较好..
# 用/会报错-----slice indices must be integers or None or have an __index__ method
size=len(sourcelist)//2

sourcelist.sort()

print sum(sourcelist[:size])-sum(sourcelist[size:])

假如最小值为正数,当前数组a和数组b的和之差为
    A = sum(a) - sum(b)
    a的第i个元素和b的第j个元素交换后,a和b的和之差为
    A' = sum(a) - a[i] + b[j] - (sum(b) - b[j] + a[i])
           = sum(a) - sum(b) - 2 (a[i] - b[j])
           = A - 2 (a[i] - b[j])
    设x = a[i] - b[j]
    |A| - |A'| = |A| - |A-2x|
    
    |A'|= |A-2x|
    假设A > 0,
    当x 在 (0,A)之间时,做这样的交换才能使得交换后的a和b的和之差变小,x越接近A/2效果越好,
    如果找不到在(0,A)之间的x,则当前的a和b就是答案。
    所以算法大概如下:
    在a和b中寻找使得x在(0,A)之间并且最接近A/2的i和j,交换相应的i和j元素,重新计算A后,重复前面的步骤直至找不到(0,A)之间的x为止。

def change(llist, rlist):
    r = lenth - 1
    tflag = 1
    global flag
    global cha
    while r >= 0 and tflag:
        for l in range(lenth):
            if ((rlist[r] - llist[l]) * 2 <= cha and rlist[r] > llist[l]):
                rlist[r], llist[l] = llist[l], rlist[r]
                rlist.sort()
                llist.sort()
                cha = sum(rlist) - sum(llist)
                tflag = 0
                break
        else:
            r -= 1

    if (r < 0):
        flag = 0
    return (llist, rlist)


if (__name__ == '__main__'):
    li1=[1,21,3,14]
    li2=[8,4,5,7]
    sourcelist=[]
    for i in li1:
        sourcelist.append(i)
    for j in li2:
        sourcelist.append(j)
    sourcelist.sort()
    lenth = len(sourcelist) // 2
    llist = sourcelist[:lenth]
    rlist = sourcelist[lenth:]
    cha = sum(rlist) - sum(llist)
    flag = 1
    while flag:
        (llist, rlist) = change(llist, rlist)
    print llist, sum(llist)
    print rlist, sum(rlist)
    print cha
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
希尔排序又称为缩小增量排序,是一种插入排序的改进版。希尔排序的基本思想是将待排序的序列分割成若干个子序列,子序列元素通过插入排序进行排序,然后逐步缩小子序列的跨度,直到子序列只剩下一个元素为止。希尔排序的时间复杂度为 O(nlogn)。 希尔排序的稳定性:由于希尔排序是分段进行的插入排序,每次排序都发生了跨越式的移动,因此希尔排序是一个不稳定的排序算法。 下面是C语言实现希尔排序的源代码和注释: ```c #include<stdio.h> #include<stdlib.h> void shell_sort(int arr[], int len) { int gap, i, j, temp; // 设置增量gap,并逐步缩小增量 for (gap = len / 2; gap > 0; gap /= 2) { // 从第gap个元素开始,逐个对其所在组进行直接插入排序操作 for (i = gap; i < len; i++) { temp = arr[i]; j = i - gap; while (j >= 0 && arr[j] > temp) { arr[j + gap] = arr[j]; j -= gap; } arr[j + gap] = temp; } } } int main() { int arr[] = { 8, 3, 6, 4, 2, 9, 1, 5, 7 }; int len = sizeof(arr) / sizeof(arr[0]); shell_sort(arr, len); printf("排序后的组为:\n"); for (int i = 0; i < len; i++) { printf("%d ", arr[i]); } printf("\n"); return 0; } ``` 在上述代码,我们首先定义了一个名为`shell_sort`的函,该函接受两个:一个整型组`arr`和组的长度`len`。在函,我们首先设置了增量`gap`,并且逐步将其缩小直到为1。在每次遍历,我们从第`gap`个元素开始,对其所在组进行直接插入排序操作,然后将增量`gap`再次缩小,重复上述操作,直到`gap`为1。 最后在主函,我们定义了一个整型组`arr`,并将其传递给`shell_sort`函进行排序。排序完成后,我们输出排序后的组。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值