Java进阶第四章——算法

常见的算法

  • 排序算法:冒泡排序、选择排序

  • 查找算法:二分查找法

  • Java中实际上已经封装好了这些算法,例如Java中提供的一个数组工具类:java.util.Arrays中有一个静态方法sort方法。

  • 对于其中的一些原理请阅读数据结构学习笔记:

    ①查找算法:数据结构学习第七章查找

    ②排序算法:数据结构学习第八章排序

7.冒泡排序算法

  • 冒泡排序核心思想:

    ①可以从前往后(也可以从后往前),依次两两比较,不符合规则的即交换。

    ②经过一趟比较后,已经有一个处于正确的位置,减去这个元素继续冒泡排序。

    ③有n个元素,经过n-1趟排序后,排序完成。

  • 用Java实现冒泡排序

java 复制代码
public class BubbleSort {

    public static void main(String[] args) {
        int[] arr = {2,5,23,52,1,34};
        for (int i = 0; i < arr.length; i++) {
            System.out.printf(String.valueOf(arr[i]) + " ");	 //2 5 23 52 1 34
        }
        //冒泡排序实现从小到大排序
        for (int i = arr.length-1; i >0; i--) {
            for (int j = 0; j < i; j++) {
                if(arr[j] > arr[j+1]){
                  int temp;
                  temp = arr[j];
                  arr[j] = arr[j+1];
                  arr[j+1]=temp;
            }
        } }
        System.out.println();
        for (int i = 0; i < arr.length; i++) {
            System.out.printf(String.valueOf(arr[i]) + " ");  //1 2 5 23 34 52 
        }
    }
}

8.选择排序算法

  • 选择排序核心思想:

    每次找出最小值与对还未排序的数据元素中第一个元素进行交换。

  • 用Java实现选择排序算法

java 复制代码
public class SelectSort {
    public static void main(String[] args) {
        int[] arr = {2,5,23,52,1,34};
        for (int i = 0; i < arr.length; i++) {
            System.out.printf(String.valueOf(arr[i]) + " ");  //2 5 23 52 1 34 
        }
        //从小到大选择排序
        for (int i = 0; i < arr.length; i++) {
            //记录最小值下标为:第一个元素
            int min = i;

            for (int j = i+1; j < arr.length; j++) {
                if(arr[j]<arr[min]){
                    //遍历后面的元素,如果元素小于最小值,更新最小值下标
                    min = j;
                }
            }
            //遍历完后面的元素,如果最小值有变,这需要更换位置。
            if(min != i){
                int temp;
                temp = arr[min];
                arr[min] = arr[i];
                arr[i] = temp;
            }
        }
        System.out.println();
        for (int i = 0; i < arr.length; i++) {
            System.out.printf(String.valueOf(arr[i]) + " ");  //1 2 5 23 34 52 
        }

    }
}

9.二分查找

  • 普通查找就是一个一个找,也就是把数组从头到尾遍历一次,如果有就返回下标。
java 复制代码
public class ArraySearch {
    public static void main(String[] args) {
        int[] arr = {2,5,23,52,1,34};
        int index = Search(arr,52);
        System.out.println(index == -1 ? "该元素不存在!" : "该元素下标是:" + index);   //该元素下标是:3
        int index2 = Search(arr,100);
        System.out.println(index2 == -1 ? "该元素不存在!" : "该元素下标是:" + index2);  //该元素不存在!

    }
    public static int Search(int[] arr,int index){
        for (int i = 0; i < arr.length; i++) {
            if(arr[i] == index){
                return i;//结束当前方法
            }
        }
        return -1;
    }
}
  • 二分法查找:在已经排序好的算法中进行查找。每次将待查记录的所在区间缩小一半

  • 二分法查找核心思想:

    ①设表长n,设置指针low,high和mid分别指向待查元素所在区间的上界、下界和中点,key为要查找的值。

    ②初始,low=0,high=arr.length-1,mid=(low+high)/2。(注:由于计算机存储原理,若mid有小数部分,则向下取整数)

    ③让key与mid所指记录比较:

    ---若key==R[mid].key,查找成功

    ---若key<=R[mid].key,high=mid-1

    ---若key>=R[mid].key,low=mid+1

    ④重复③,直到low>high时,查找失败。

java 复制代码
public class ArraySearchTwo {
    public static void main(String[] args) {
        int[] arr = {100,200,235,600,1000,2000,9999 };

        //找出arr这个数组中2000所在的下标
        int index = binarySeary(arr,2000);

        System.out.println(index == -1 ? "该元素不存在" : "该元素的下标为:" + index);//该元素的下标为:5
        int index2 = binarySeary(arr,300);
        System.out.println(index2 == -1 ? "该元素不存在" : "该元素的下标为:" + index2);//该元素不存在
    }

    private static int binarySeary(int[] arr, int dest) {
        //开始下标low
        int low = 0;
        //结束下标high
        int high = arr.length -1;
        while(low <= high){
            int mid = (low + high) / 2;
            if(arr[mid] == dest){
               return mid;
            } else if (arr[mid] < dest) {
               //目标在中间的右边,开始元素下标low变化
               low = mid + 1;
            }else {
            //目标在中间的右边,结束下标high变化
               high = mid - 1;
        }
        }
        return -1;
    }
}

10. Arrays工具类使用

  • 在开发中,java.util.Arrays工具类中的方法在开发中要参考API帮助文档。
  • 使用工具类实现进行二分查找
java 复制代码
import java.util.Arrays;

public class Test {

    public static void main(String[] args) {
        int[] arr = {3,6,45,21,47,51,31,4,7};
        //使用工具类排序
        Arrays.sort(arr);

        //输出排序好的结果
        for (int i = 0; i < arr.length; i++) {
            System.out.printf(arr[i] + " ");  //3 4 6 7 21 31 45 47 51 
        }
        System.out.println();

        //二分查找(需要已经排序好的数组),使用工具类
        int index = Arrays.binarySearch(arr,45);
        System.out.println(index == -1 ? "该元素不存在" : "该元素下标:"+index);  //该元素下标:6
    }
}

------本章节为个人学习笔记。学习视频为动力节点Java零基础教程视频:动力节点---JAVA零基础教程视频

相关推荐
浮生如梦_1 小时前
Halcon基于laws纹理特征的SVM分类
图像处理·人工智能·算法·支持向量机·计算机视觉·分类·视觉检测
XiaoLeisj2 小时前
【JavaEE初阶 — 多线程】单例模式 & 指令重排序问题
java·开发语言·java-ee
paopaokaka_luck2 小时前
【360】基于springboot的志愿服务管理系统
java·spring boot·后端·spring·毕业设计
dayouziei2 小时前
java的类加载机制的学习
java·学习
励志成为嵌入式工程师3 小时前
c语言简单编程练习9
c语言·开发语言·算法·vim
捕鲸叉3 小时前
创建线程时传递参数给线程
开发语言·c++·算法
A charmer3 小时前
【C++】vector 类深度解析:探索动态数组的奥秘
开发语言·c++·算法
Yaml44 小时前
Spring Boot 与 Vue 共筑二手书籍交易卓越平台
java·spring boot·后端·mysql·spring·vue·二手书籍
小小小妮子~4 小时前
Spring Boot详解:从入门到精通
java·spring boot·后端
hong1616884 小时前
Spring Boot中实现多数据源连接和切换的方案
java·spring boot·后端