Skip to content

Instantly share code, notes, and snippets.

@shendongming
Created May 16, 2013 14:39
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save shendongming/5592212 to your computer and use it in GitHub Desktop.
Save shendongming/5592212 to your computer and use it in GitHub Desktop.
split_array
/*
有两个数组a,b,大小都为n,数组元素的值任意整形数,无序;
要求:通过交换a,b中的元素,使[数组a元素的和]与[数组b元素的和]之间的差最小。
*/
function split_arr(arr1, arr2) {
var diff, diff2, t, v,min_diff;
console.log('init')
console.log('arr1', arr1)
console.log('arr2', arr2)
while (true) {
diff =min_diff= (sum(arr1) - sum(arr2));
console.log('diff',diff)
diff2 = diff;
v = null
for (var i = 0; i < arr1.length; i++) {
for (var j = 0; j < arr2.length; j++) {
diff2 = diff + 2 * (arr2[j] - arr1[i])
//console.log('diff2',diff2,'diff1',diff)
if (Math.abs(diff2) < Math.abs(diff)) {
v = [i, j]
min_diff = diff2;
}
};
};
console.log('min diff', min_diff,'v',v)
if (v == null) {
console.log('diff', sum(arr1) - sum(arr2))
break;
} else {
t = arr1[v[0]];
arr1[v[0]] = arr2[v[1]];
arr2[v[1]] = t;
console.log('swap', v)
console.log('arr1', arr1,'sum',sum(arr1))
console.log('arr2', arr2,'sum',sum(arr2))
if (diff2 == 0) {
console.log('done')
break;
}
}
}
}
function sum(arr) {
var all = 0;
for (var i = 0; i < arr.length; i++) {
all += arr[i]
};
return all
}
var a = [1, 2, 13, 4, 5]
var b = [3, 2, 3, 4, 5]
split_arr(a, b)
split_arr([1,2,8],[5,6,7])
split_arr([9,2,8],[5,60,9])
split_arr([2,1,3],[9,9,9])
split_arr([301,10,-9],[300,1,-5])
/*
如果说是
100,50,30;
101,54,27;
程序就不会交换值
但真正最小的是
100,54,27
101,50,30
*/
//{301, 10, -9} &amp; {300, 1, -5}
split_arr([100,50,30],[101,54,27])
/*
程序打印结果如下:
init
arr1 [ 1, 2, 13, 4, 5 ]
arr2 [ 3, 2, 3, 4, 5 ]
diff 8
min diff 6 v [ 4, 3 ]
swap [ 4, 3 ]
arr1 [ 1, 2, 13, 4, 4 ] sum 24
arr2 [ 3, 2, 3, 5, 5 ] sum 18
diff 6
min diff 4 v [ 4, 2 ]
swap [ 4, 2 ]
arr1 [ 1, 2, 13, 4, 3 ] sum 23
arr2 [ 3, 2, 4, 5, 5 ] sum 19
diff 4
min diff 2 v [ 4, 1 ]
swap [ 4, 1 ]
arr1 [ 1, 2, 13, 4, 2 ] sum 22
arr2 [ 3, 3, 4, 5, 5 ] sum 20
diff 2
min diff 0 v [ 3, 1 ]
swap [ 3, 1 ]
arr1 [ 1, 2, 13, 3, 2 ] sum 21
arr2 [ 3, 4, 4, 5, 5 ] sum 21
diff 0
min diff 0 v null
diff 0
init
arr1 [ 1, 2, 8 ]
arr2 [ 5, 6, 7 ]
diff -7
min diff 3 v [ 1, 2 ]
swap [ 1, 2 ]
arr1 [ 1, 7, 8 ] sum 16
arr2 [ 5, 6, 2 ] sum 13
diff 3
min diff -1 v [ 2, 1 ]
swap [ 2, 1 ]
arr1 [ 1, 7, 6 ] sum 14
arr2 [ 5, 8, 2 ] sum 15
diff -1
min diff -1 v null
diff -1
init
arr1 [ 9, 2, 8 ]
arr2 [ 5, 60, 9 ]
diff -55
min diff -53 v [ 2, 2 ]
swap [ 2, 2 ]
arr1 [ 9, 2, 9 ] sum 20
arr2 [ 5, 60, 8 ] sum 73
diff -53
min diff 49 v [ 2, 1 ]
swap [ 2, 1 ]
arr1 [ 9, 2, 60 ] sum 71
arr2 [ 5, 9, 8 ] sum 22
diff 49
min diff 47 v [ 0, 2 ]
swap [ 0, 2 ]
arr1 [ 8, 2, 60 ] sum 70
arr2 [ 5, 9, 9 ] sum 23
diff 47
min diff 41 v [ 0, 0 ]
swap [ 0, 0 ]
arr1 [ 5, 2, 60 ] sum 67
arr2 [ 8, 9, 9 ] sum 26
diff 41
min diff 41 v null
diff 41
init
arr1 [ 2, 1, 3 ]
arr2 [ 9, 9, 9 ]
diff -21
min diff -9 v [ 2, 2 ]
swap [ 2, 2 ]
arr1 [ 2, 1, 9 ] sum 12
arr2 [ 9, 9, 3 ] sum 21
diff -9
min diff -5 v [ 1, 2 ]
swap [ 1, 2 ]
arr1 [ 2, 3, 9 ] sum 14
arr2 [ 9, 9, 1 ] sum 19
diff -5
min diff -5 v null
diff -5
init
arr1 [ 301, 10, -9 ]
arr2 [ 300, 1, -5 ]
diff 6
min diff 4 v [ 0, 0 ]
swap [ 0, 0 ]
arr1 [ 300, 10, -9 ] sum 301
arr2 [ 301, 1, -5 ] sum 297
diff 4
min diff 4 v null
diff 4
init
arr1 [ 100, 50, 30 ]
arr2 [ 101, 54, 27 ]
diff -2
min diff 0 v [ 0, 0 ]
swap [ 0, 0 ]
arr1 [ 101, 50, 30 ] sum 181
arr2 [ 100, 54, 27 ] sum 181
diff 0
min diff 0 v null
diff 0
*/
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment