解决某个实际问题的过程和方法!
学习算法:
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));//3
- System.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));//false
- System.out.println(checkQQ("254167841"));//true
- System.out.println(checkQQ("2541ds434"));//false
- System.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号码是否为null
- if(qq == null || qq.startsWith("0") || qq.length() < 6 || qq.length() > 20){
- return false;
- }
- //2、qq至少是不是null,不是以8开头的,满足6-20之间的长度
- //判断qq号码中是否都是数字
- //qq = 2514ghd234
- for (int i = 0; i < qq.length(); i++) {
- //根据索引提取当前位置处的字符
- char ch = qq.charAt(i);
- //判断ch记住的字符,如果不是数字,qq号码不合法
- if(ch<'0'||ch>'9'){
- return false;
- }
- }
- return true;
- }
- }
规则:

