1.二分法
-
用于查找有序数组中是否存在某个数组元素,以及它的位置
-
每次查找时,从范围中选取中间部位的数字进行比较,如果不相等,则按照比较结果缩小范围
-
//猜一猜目标数字是否在数组中,以及它在数组中的哪个位置 int[] arr = {1, 3, 5, 6, 10, 77, 78, 90}; Scanner input = new Scanner(System.in); System.out.print("请输入目标数字:"); int num = input.nextInt();//目标数字 //范围会随着循环不断变小 int left = 0;//范围最左侧 int right = arr.length - 1;//范围最右侧 while(left <= right) { /*if (left > right){ System.out.println("没有找到"); break; }*/ int middle = (left + right) / 2;//中间数字的下标 //拿中间的数字和目标数字作比较 if (arr[middle] == num) { System.out.println("找到了,这个数字是数组中的第" + (middle + 1) + "个"); break; } else if (arr[middle] > num) { right = middle - 1; } else { left = middle + 1; } } if (left > right) { System.out.println("没找到"); }
2.求三个班的平均分
-
//计算3个班的平均分 Scanner scanner = new Scanner(System.in); int[] scores = new int[5];//一个班有5个人 //外层循环代表班级,循环一次得到一个班级的平均分 //内层循环代表分数,循环一次累加一个分数 for (int j = 0; j < 3; j++) { int sum = 0;//班级总分 System.out.println("---------开始统计第" + (j + 1) + "个班的成绩---------"); for (int i = 0; i < scores.length; i++) { System.out.print("请输入第" + (i + 1) + "个人的成绩:"); scores[i] = scanner.nextInt(); sum = sum + scores[i];//累加求和 } System.out.println("平均分为" + (double)sum / scores.length);
3.在数组中插入元素
-
int [] nums = {1, 4, 6, 7}; //向nums中插入一个数字 //因为原数组没有空间插入新数字,所以复制一个长度+1的新数字 int[] newNums = Arrays.copyOf(nums,5); System.out.println(Arrays.toString(newNums));//[1, 4, 6, 7, 0] //向数组中插入一个数字,要求插入后仍然是顺序排序 //1.先找到要插入的位置 Scanner input = new Scanner(System.in); System.out.println("请输入要插入的数字:"); int num = input.nextInt(); //遍历数组,将要插入的数字跟数组元素做比较 /*int index = 0;//要插入的位置(记录下标) int i = 0; for (; i < newNums.length; i++) { //如果num小于某个数组元素,则说明找到了应当插入的位置,记录下来 if (num <= newNums[i]) { index = i; break;//找到了就跳出循环 } } if (i == newNums.length) { index = newNums.length - 1; }*/ int index = -1; for (int i = 0; i < newNums.length; i++) { //如果num小于某个数组元素,则说明找到了应当插入的位置,记录下来 if (num <= newNums[i]) { index = i; break;//找到了就跳出循环 } } if (index == -1) { index = newNums.length - 1; } //从后往前依次给元素重新赋值,后一个元素的值等于前一个元素。 //循环条件为i > index , 即只挪动插入位置之后的元素 //2.将元素后移,腾出位置 for (int i = newNums.length - 1; i > index ; i--) { newNums[i] = newNums[i - 1]; } //3.将要插入的元素放入指定位置 newNums[index] = num; System.out.println(Arrays.toString(newNums));
4.冒泡排序
-
冒泡排序是相邻两个做比较,(顺序排序时)将较大的数字往后移,每轮循环都会使一个最大的数放在最后一位,然后剩下的数字再进行下一轮比较
-
N个数字来排序,两两相比小在前,外层循环N-1,内层循环N-1-i;
-
int [] arr = {5, 2, 1, 4, 3}; //外层循环代表轮数,5个数字比较4轮,每轮(剩下的数字)都会有一个最大的放在最后一位 for (int i = 0; i < arr.length - 1; i++) { //j可以写成<arr.length - 1, 但是实际上后面的比较是无用的,携程arr.lenth -1 -i 可以减少资源浪费 //内层循环代表比较次数,每次都是相邻两个数字做比较 //内层循环的次数 = 数组元素长度 - 1 - 轮数(轮数从0开始) for (int j = 0; j < arr.length - 1 - i; j++) { //如果不是小的在前,则交换两个元素的值,使其变为小的在前 if (arr[j] > arr[j + 1]) { int temp; temp = arr[j]; arr[j] = arr[j + 1]; arr[j + 1] = temp; } } }
-
如果要逆序,只需要将if判断的条件改为<
5.选择排序
-
int [] arr = {5, 3, 2, 4, 1}; //外层循环代表轮数,每一轮都会将(剩下的数中)最小值放在最前面 for (int i = 0; i < arr.length - 1; i++) { //内层循环代表次数,每轮都是拿(剩下的数中)的第一个元素和其他元素作比较 //第0轮,拿第0个元素和其他元素比较 //第1轮,拿第1个元素和其他元素比较 //第i轮,拿第i个元素和其他元素比较 //第i轮比较时,第一个元素的下标为i,其他元素下标的范围为i + 1到length - 1 for (int j = i + 1; j < arr.length; j++) { if(arr[i] > arr[j]) { int temp = arr[i]; arr[i] = arr[j]; arr[j] = temp; } } } System.out.println(Arrays.toString(arr));
如果要逆序,只需要将if判断的条件改为<
6.Arrays.sort()
-
java为我们提供了数组排序的方法,是顺序排序
-
int [] arr = {1, 3, 5, 1, 2}; Arrays.sort(arr); System.out.println(Arrays.toString(arr));