交换两个数组 差最小 java_如何交换两个等长整形数组使其数组和的差最小(C和java实现)...

1 importjava.util.Arrays;2

3 /**

4 *5 *@authorAdministrator6 *7 */

8 public classTestUtil {9 private int[] arrysMin = null;10

11 private int[] arrysMax = null;12

13 private int matchNum = 0;14

15 private boolean hasMatched = false;16

17 /**

18 * 返回数组的所有元素的总和19 *20 *@paramarrays21 * 待计算数组22 *@return所有元素的总和值23 */

24 public int getArraySum(int[] arrays) {25 int sum = 0;26 if (null !=arrays) {27 for (inti : arrays) {28 sum +=i;29 }30 }31 returnsum;32 }33

34 /**

35 * 返回数组的差值36 *37 *@paramarray138 * 集合一39 *@paramarray240 * 集合二41 *@return差值42 */

43 public int getTowArraysMacth(int[] array1, int[] array2) {44 Integer l1 =getArraySum(array1);45 Integer l2 =getArraySum(array2);46

47 if ((l1 - l2) / 2 > 0) {48 arrysMax =array1;49 arrysMin =array2;50 return (l1 - l2) / 2;51 } else{52 arrysMax =array2;53 arrysMin =array1;54 return (l2 - l1) / 2;55 }56 }57

58 private boolean isReturn(int[] arrayMax, int[] arrayMin) {59 Integer l1 =getArraySum(arrayMax);60 Integer l2 =getArraySum(arrayMin);61

62 if ((l1 - l2) > 0) {63 return false;64 } else{65 return true;66 }67 }68

69 public voiddoMatch() {70 //保证大的数组总和永远是大的,以防递归进入死循环

71 if(isReturn(arrysMax, arrysMin)) {72 return;73 }74 //获取元素总和大的与小的差值平均值

75 int diff =getTowArraysMacth(arrysMax, arrysMin);76 //使用一个大数字初始化最小绝对值,后面做比较

77 int abs =getArraySum(arrysMax);78 int tempElement = 0;79 //最终大数组要交换的下标

80 int maxIndex = -1;81 int minIndex = -1;82 if (null != arrysMax && null !=arrysMin) {83 for (int i = 0; i < arrysMax.length; i++) {84 for (int j = 0; j < arrysMin.length; j++) {85 int temp = arrysMax[i] -arrysMin[j];86 if (temp > 0 && diff >temp) {87 //如果元素差值和元素总和大的与小的差值平均值正好相等,直接交换元素OK

88 if (Math.abs(diff - temp) == 0) {89 tempElement =arrysMin[j];90 arrysMin[j] =arrysMax[i];91 arrysMax[i] =tempElement;92 matchNum++;93 hasMatched = true;94 return;95 } else{96 //否则完全遍历,最终找出元素差值和总和差值平均值差距最小的两元素,

97 if (abs > Math.abs(diff -temp)) {98 abs = Math.abs(diff -temp);99 maxIndex =i;100 minIndex =j;101 }102 }103 }104 }105 }106 //如果没有找到匹配项,且在已变换的数组中找到了满足条件的变量,则继续递归

107 if (!hasMatched && (maxIndex != -1 || minIndex != -1)) {108 //交换差距最小的两元素

109 System.out.printf("第%d次交换, Max[%d]:%d, Min[%d]:%d\n", ++matchNum, maxIndex, arrysMax[maxIndex], minIndex, arrysMin[minIndex]);110 tempElement =arrysMin[minIndex];111 arrysMin[minIndex] =arrysMax[maxIndex];112 arrysMax[maxIndex] =tempElement;113 System.out.println("交换后Max数组:" +Arrays.toString(arrysMax));114 System.out.println("交换后Min数组:" +Arrays.toString(arrysMin));115 System.out.println();116 //递归

117 doMatch();118 }119 }120 }121

122 public intgetMatchNum() {123 returnmatchNum;124 }125

126 /**

127 *@paramargs128 */

129 public static voidmain(String[] args) {130 TestUtil tu = newTestUtil();131 int[] a1 = { 11, 2, 4, 6, 47};132 int[] a2 = { 4, 5, 8, 9, 2};133 System.out.println("交换前数组a1:" +Arrays.toString(a1));134 System.out.println("交换前数组a2:" +Arrays.toString(a2));135 //进行第一次分出,两元素的总和谁大谁小

136 tu.getTowArraysMacth(a1, a2);137 //开始进行处理交换

138 tu.doMatch();139 //打印交换结果

140 System.out.println("交换次数:" +tu.getMatchNum());141 System.out.println("a1数组元素和:" +tu.getArraySum(a1));142 System.out.println("a2数组元素和:" +tu.getArraySum(a2));143 System.out.println("交换后原数组a1:" +Arrays.toString(a1));144 System.out.println("交换后原数组a2:" +Arrays.toString(a2));145 }146 }

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值