7-1 多数组排序
分数 10
作者 温彦
单位 山东科技大学
3个整数数组进行整体排序,根据输入的三个数组的元素,输出排序后的结果(从大到小)
输入格式:
第1个数组的长度
第1个数组的各个元素
第2个数组的长度
第2个数组的各个元素
第3个数组的长度
第3个数组的各个元素
输出格式:
所有数组的整体排序
代码如下:
import java.util.*;
public class Main {
public static void main(String[] args) {
/*
* 思路分析:
* 1.经分析使用ArrayList集合更好
* 2.用数组接收输入的数据,然后存放到ArrayList集合当中
* 2.2 因为有三组数据 我为了避免重复劳动,使用同一个数组
* 连续接收三次,所以在外层又套了一个接收三次的循环
* 3.里层的for循环既接收了输入的数组,又把输入的数据放在List集合当中
* 4.调用ArrayList的排序方法sort方法完成对集合的排序
* */
ArrayList list = new ArrayList();
Scanner scanner = new Scanner(System.in);
//由题可知只有三个数组,flag用来控制三个数组的输入
int flag = 1;
while (flag <= 3) {
int a = scanner.nextInt();
int[] arr = new int[a];
for (int i = 0; i < arr.length; i++) {
arr[i] = scanner.nextInt();
list.add(arr[i]);
}
//为了跳出循环
flag++;
}
//默认是升序排列,但是题目要求是降序,其实应该直接排序(划掉)
//运用了sort的定制排序,打开sort源码
// 我对i1-i2 是从小到大排序 i2 - i1 是从大到小排序的理解:
// 首先 因为在 if 里面我们判断 是交换的条件是 传入参数之后的返回值大于0
// 使用 i1 - i2 的本质就是 i1与i2的值大的挪到小的后面
// (i1-i2) i1对应的就是arr[0] i2对应的
// 就是arr[1] 在第一次比较中.
// 这就相当于 第一个值 如果 大于第二个值 就将第一个值和第二个值交换顺序)
//i2 - i1 的本质就是 值小的挪到值大的后面
// (i2 - i1则是相当于如果第二个大于第一个就交换arr[0]和
// arr[1]的值)
//总而言之,记住就行 i1-i2是升序,i2-i1是降序
Collections.sort(list, new Comparator() {
@Override
public int compare(Object o1, Object o2) {
int i1 = (Integer) o1;
int i2 = (Integer) o2;
return i2 - i1;
}
});
//为了满足变态的输出格式,烦死我!!!!!!!!
int temp = 0;
for (Object o : list) {
System.out.print(o);
temp++;
if (temp < list.size())
System.out.print(" ");
}
}
}
思路是调用Connections实现类的的sort方法将list集合进行排序,它默认的排序方法是升序(即从小到大)运用定制排序的方法(解释定制排序原理代码如下:)
import java.util.Comparator; public class Math01 { public static void main(String[] args) { //20 0 8 1 -1 int[] arr = {-1, 1, 8, 0, 20}; //bubble01(arr); bubble02(arr, new Comparator() { @Override public int compare(Object o1, Object o2) { int i1 = (Integer) o1; int i2 = (Integer) o2; //此处决定着是从到大小排序还是从小到大排序 //举例:下面的控制条件是 >0 执行交换 按照 // 第一次:i1-i2 i1->arr[0] i2->arr[1] //1-(-1) = 2 > 0 所以 进行交换 // 通过 for 的内层循环 实现comper的传进的实参更新 //我对 为什么 i1-i2 是从小到大排序 i2 - i1 是从大到小排序的理解: // 首先 因为在 if 里面我们判断 是交换的条件是 传入参数之后的返回值大于0 // 使用 i1 - i2 的本质就是 i1与i2的值大的挪到小的后面(i1-i2 i1对应的就是arr[0] i2对应的 // 就是arr[1] 在第一次比较中。 这就相当于 第一个值 如果 大于第二个值 就将第一个值和第二个值交换顺序) //i2 - i1 的本质就是 值小的挪到值大的后面(i2 - i1则是相当于如果第二个大于第一个就交换arr[0]和 // arr[1]的值) // return i1 - i2;// return i2 - i1; } }); System.out.println("==定制排序后的情况=="); System.out.println(Arrays.toString(arr)); } //结合冒泡 + 定制 public static void bubble02(int[] arr, Comparator c) { int temp = 0; for (int i = 0; i < arr.length - 1; i++) { for (int j = 0; j < arr.length - 1 - i; j++) { //数组排序由 c.compare(arr[j], arr[j + 1])返回的值决定 if (c.compare(arr[j], arr[j + 1]) > 0) { temp = arr[j]; arr[j] = arr[j + 1]; arr[j + 1] = temp; } } } } }
解决了本题,如有错误还请指正(萌新一枚,轻喷)