算法
解决某个实际问题的过程和方法!
学习算法:
1、先搞清楚算法的流程
2、直接去推敲如何写代码
排序算法
冒泡排序
每次从数组中找出最大值放在数组的后面去。
package algorithm;import java.util.Arrays;public class Test1 {public static void main(String[] args) {// 1、定义一个数组int[] arr = {5,2,3,1};// 2、定义一个循环控制几轮for (int i = 0; i < arr.length - 1; i++) {//3、定义一个循环控制每轮比较几次for (int j = 0; j < arr.length -i - 1; j++) {//判断当前位置的元素值,是否大于后一个位置处的元素值,如果大则交换if(arr[j] > arr[j+1]){int temp = arr[j + 1];arr[j + 1] = arr[j];arr[j] = temp;}}}System.out.println(Arrays.toString(arr));}
}
实现冒泡排序的关键步骤分析:
确定总共需要做几轮:数组的长度 - 1;
每轮比较次数 。
当前位置大于后一位置。
选择排序
每轮选择当前位置,开始找出后面的较小值与该位置交换。
package algorithm;import java.util.Arrays;public class Test2 {public static void main(String[] args) {//1、准备数组int[] arr = {5, 1, 3, 2};//2、控制选择几轮for (int i = 0; i < arr.length - 1; i++) {// 3、控制每轮选择几次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));}
}
实现选择排序优化:
package algorithm;import java.util.Arrays;public class Test2 {public static void main(String[] args) {//1、准备数组int[] arr = {5, 1, 3, 2};//2、控制选择几轮for (int i = 0; i < arr.length - 1; i++) {int minIndex = i;// 3、控制每轮选择几次for (int j = i + 1; j < arr.length; j++) {// 判断当前位置是否大于后面位置处的元素值,若大于则交换if(arr[minIndex] > arr[j]){minIndex = j;}}if(minIndex != i){int temp = arr[i];arr[i] = arr[minIndex];arr[minIndex] = temp;}}System.out.println(Arrays.toString(arr));}
}
选择排序的关键:
确定总共需要选择几轮:数组的长度-1;
控制每轮从以前位置为基准,与后面元素选择几次。
二分查找算法:
前提条件:数组中的数据必须是有序的;
核心思想:每次排除一般的数据,查询数据的性能明显提高极多!
package algorithm;public class Test3 {public static void main(String[] args) {//1、准备数组int[] arr = {7, 23, 79, 80, 103, 124, 134, 146};System.out.println(binarySearch(arr, 80));//3System.out.println(binarySearch(arr, 100));//-1}public static int binarySearch(int[] arr, int data){//1、定义两个变量,一个站在左边位置,一个站在右边位置int left = 0;int right = arr.length - 1;//2、定义一个循环控制折半。while(left <= right){int mid = (left + right) / 2;if(arr[mid] > data){right = mid - 1;}else if(arr[mid] < data){left = mid + 1;}else{return mid;}}return -1;}
}
正则表达式
由一些特定的字符组成,代表一个规则。
作用:
1、校验数据格式是否合法;
2、在一段文本中查找满足要求的内容。
package d2_regex;//校验qq号是否正确,要求全部是数字,长度是6-20之间,不能以0开头
public class RegexTest1 {public static void main(String[] args) {System.out.println(checkQQ(null));//falseSystem.out.println(checkQQ("254167841"));//trueSystem.out.println(checkQQ("2541ds434"));//falseSystem.out.println("=================");System.out.println(checkQQ1(null));System.out.println(checkQQ1("254167841"));System.out.println(checkQQ1("2541ds434"));}//正则表达式public static boolean checkQQ1(String qq){return qq != null && qq.matches("[1-9]\\d{5,19}");}public static boolean checkQQ(String qq){//1、判断qq号码是否为nullif(qq == null || qq.startsWith("0") || qq.length() < 6 || qq.length() > 20){return false;}//2、qq至少是不是null,不是以8开头的,满足6-20之间的长度//判断qq号码中是否都是数字//qq = 2514ghd234for (int i = 0; i < qq.length(); i++) {//根据索引提取当前位置处的字符char ch = qq.charAt(i);//判断ch记住的字符,如果不是数字,qq号码不合法if(ch<'0'||ch>'9'){return false;}}return true;}
}
规则: