Created
May 16, 2013 14:39
-
-
Save shendongming/5592212 to your computer and use it in GitHub Desktop.
split_array
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* | |
有两个数组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} & {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