Java中的常用算法
一、冒泡排序
重点规律:冒泡排序的最外层的次数是arr.length-1
第二层的循环的次数是arr.length-1-i
package com.qu; import java.util.Arrays; public class D4 { public static void main(String[] args) { // 冒泡排序 int[] arr = {1,2,33,11,222,754,998}; for (int i = 0; i < arr.length-1; i++) { for (int j = 0; j < arr.length-1-i; j++) { if (arr[j]>arr[j+1]) { int temp = arr[j]; arr[j] = arr[j+1]; arr[j+1] = temp; } } } System.out.println(Arrays.toString(arr)); } }
二、选择排序
思路:先把第i个当成默认值,然后与后面的数进行比较(i+1)取最小值,判断第i个数不等于最小值就交换位置
...循环
package com.qu; import java.util.Arrays; import java.util.Iterator; public class XuanZeSort { public static void main(String[] args) { // 选择排序 简单写法 int[] arr = {222,322,11,2,3213,2222,5634,7,89,654}; // for (int i = 0; i < arr.length-1; i++) { // 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)); // 选择排序2 for (int i = 0; i < arr.length-1; i++) { int min = i; //这个地方是索引 for (int j = i+1; j < arr.length; j++) { if (arr[min] > arr[j]) { min = j; } } if (min != i) { int temp = arr[min]; arr[min] = arr[i]; arr[i] = temp; } } System.out.println(Arrays.toString(arr)); } }
三、插入排序
思路:第一次比较12个,第二次比较123个,第三次比较1234个...
package com.qu; import java.util.Arrays; public class ChaRuSort { public static void main(String[] args) { // 插入排序 int[] arr = {1,23,22,11,2,6,84,99}; //待插入的队列 for (int i = 1; i < arr.length; i++) { int n = i; //插入的位置 while(n>0 && arr[n]<arr[n-1]) { int temp = arr[n]; arr[n] = arr[n-1]; arr[n-1] = temp; n--; } } System.out.println(Arrays.toString(arr)); } }
四、二分查找法
必须是一个有序序列,要用while的死循环,因为不知道要查多少次,还有就是要记得break关闭
package com.qu; import java.util.Scanner; public class D3 { public static void main(String[] args) { // 二分查找法 必须是有序数组 不知道查多少次,用while的死循环 int[] arr = {1,5,9,11,15,22,58,99,100}; Scanner sc = new Scanner(System.in); System.out.println("请输入一个你要查找的数:"); int num = sc.nextInt();//拿一个容器去接这个数 int start = 0;//定义初始值 是索引 int end = arr.length-1; while(true) { int mid = (end+start)/2; if (arr[mid] == num) { System.out.println("猜对了,这个数的索引是"+mid); break; }else if (arr[mid] > num) { //猜的数小了 end = mid-1; }else { //arr[mid] > num 猜的数大了 start = mid+1; } if (start>end) { System.out.println("没有这个数"); break; } } } }
五、杨辉三角
package com.qu; public class YangHui { public static void main(String[] args) { int n = 10; int[][] arr = new int[n][]; for (int i = 0; i < n; i++) { arr[i] = new int[i+1]; for (int j = 0; j <= i; j++) { if (j==0 || j==i) { arr[i][j] = 1; System.out.print(1+" "); }else { arr[i][j] = arr[i-1][j]+arr[i-1][j-1]; System.out.print(arr[i][j]+" "); } } System.out.println(); } } }
六、Arrays工具类
①打印多维数组(deepToString)
int[][] arr = {{1,2}{2,3}}; System.out.println(Arrays.deepToString(arr));
②binarySearch,二分查找(有返回值)
int[][] arr3 = {1,2,3,5,21,4}; int num = Arrays.binarySearch(arr3,5); System.out.println(num); //4 找得到就返回索引,找不到就是负数
③排序 sort
Arrays.sort(arr3);//这个工具类只能从小到大排序 System.out.println(Arrays.toString(arr3));
④替换数组指定角标位置元素,fill
Arrays.fill(arr3,0,2,666);//把索引位0-2的替换成666,左闭右开 System.out.println(Arrays.toString(arr3));//[666,666,3,5,21,4]
⑤截取数组(copyOfRange)有返回值
int arr4 = Arrays.copyOfRange(arr3,0,2);//左闭右开 System.out.println(Arrays.toString(arr4));//[1,2]