当前位置: 首页 > article >正文

JAVA学习日记(十二)算法

一、基本查找、二分查找

二、分块查找

将数组分块,每一个块中最大值小于后一个块中的最小值:块内无序,块间有序。

块:创建一个块类 

按照规则划分好块之后,对要查询的值设计方法进行查询。

import java.util.Scanner;

public class Main {
    public static void main(String[] args){ //JDK8

        int arr[]={16,5,12,9,21,18,
                32,23,37,26,45,34,
                25,48,61,52,73,66};

        Block block1=new Block(21,0,5);
        Block block2=new Block(37,6,11);
        Block block3=new Block(73,12,17);

        Block[] blockArr=new Block[]{block1,block2,block3};

        int index=getBlock(blockArr,52);

        if(index!=-1){
            int startindex = blockArr[index].getStartindex();
            int endindex = blockArr[index].getEndindex();
            System.out.println("输入你要找的数字: ");
            Scanner sc=new Scanner(System.in);
            int number = sc.nextInt();
            index=getindex(arr,number,startindex,endindex);
            if(index!=-1)
                System.out.println("索引: "+index);
            else System.out.println("不存在");
        }else System.out.println("不存在");
    }

    public static int getBlock(Block[] arr,int number){
        //确定数字number是在哪个块中
        for(int i=0;i<arr.length;i++){
            if(number<arr[i].getMax())
            return i;
        }
        return -1;
    }
    public static int getindex(int[] arr,int number,int startindex,int endindex){
        for(int i=startindex;i<endindex;i++){
            if(arr[i]==number)
                return i;
        }
        return -1;
    }

}
class Block{
    int max;
    int startindex;
    int endindex;

    public Block() {
    }

    public Block(int max, int startindex, int endindex) {
        this.max = max;
        this.startindex = startindex;
        this.endindex = endindex;
    }

    /**
     * 获取
     * @return max
     */
    public int getMax() {
        return max;
    }

    /**
     * 设置
     * @param max
     */
    public void setMax(int max) {
        this.max = max;
    }

    /**
     * 获取
     * @return startindex
     */
    public int getStartindex() {
        return startindex;
    }

    /**
     * 设置
     * @param startindex
     */
    public void setStartindex(int startindex) {
        this.startindex = startindex;
    }

    /**
     * 获取
     * @return endindex
     */
    public int getEndindex() {
        return endindex;
    }

    /**
     * 设置
     * @param endindex
     */
    public void setEndindex(int endindex) {
        this.endindex = endindex;
    }

    public String toString() {
        return "Block{max = " + max + ", startindex = " + startindex + ", endindex = " + endindex + "}";
    }
}

三、冒泡排序

     public static int[] MaoPaoSort(int[] arr){
        int temp;
        for(int i=0;i<arr.length;i++){
            for(int j=i+1;j<arr.length;j++){
                if(arr[j]<arr[j-1]){
                    temp=arr[j];
                    arr[j]=arr[j-1];
                    arr[j-1]=temp;
                }
            }
        }
        return arr;
    }

四、选择排序

    public static int[] SelectSort(int[] arr){ //选择排序 小———大
        int temp;
        for(int i=0;i<arr.length;i++){
            for(int j=i+1;j<arr.length;j++){
                if(arr[i]>arr[j]){
                    temp=arr[i];
                    arr[i]=arr[j];
                    arr[j]=temp;
                }
            }
        }
        return arr;
    }

五、插入排序

自己写的:

    public static int[] InsertSort(int[] arr){
        int N=0,temp,beginindex=0;
            for(int j=N+1;j<arr.length;j++){
                if(arr[j]>=arr[N]){

                }
                else if(arr[j]<=arr[0]){
                    temp=arr[j];
                    backMove(arr,0,j);
                    arr[0]=temp;
                }
                else if(arr[j]>arr[0]&&arr[j]<arr[N]){
                    for(int i=0;i<N;i++){
                        if(arr[j]<arr[i]){
                            beginindex=i;
                            break;
                        }
                    }
                    temp=arr[j];
                    backMove(arr,beginindex,j);
                    arr[beginindex]=temp;
                }
                N++;
            }
            return arr;
    }

    private static int[] backMove(int[] arr,int beginindex,int endindex) {
        for(int i=endindex;i>beginindex;i--){
            arr[i]=arr[i-1];
        }
        return arr;
    }

标准答案: 

    public static int[] InsertSort(int[] arr){
        int N=0,temp,beginindex=0;
            for(int j=N+1;j<arr.length;j++){
                while(j>0&&(arr[j]<arr[j-1])){
                    temp=arr[j-1];
                    arr[j-1]=arr[j];
                    arr[j]=temp;
                    j--;
                }
                    N++;
            }
            return arr;
    }

六、递归算法

递归指方法中调用方法本身的现象。

注意:递归一定要有出口(设定结束递归的条件),否则会造成内存溢出。

递归作用:

把一个复杂的问题层层转换成一个与原问题相似,但规模较小的问题来求解。

只需要少量的程序就可以描述出解题所需要的多次重复计算。

示例:

    public static int getsum(int number){
//返回0~number 所有数的和
        if(number>0)
        return number+getsum(number-1);
        else return 0;
    }
    public static int getJieChen(int number){
  //获取number的阶乘
        if(number==1)
            return 1;
        else
        return number*getJieChen(number-1);
    }

七、快速排序

   public static void QuickSort(int[] arr,int i,int j){

        int start=i,end=j;

        if(start>end){
            return;
        }
        int point=arr[i];


//一定要把end部分放在start前面,这样才会在最后递归时指向比基准值小或者等于的元素
        while(start!=end){
            while (true) {
                if (end <= start || arr[end] < point) {
                    break;
                }
                end--;
            }
            while (true) {
                if (start >= end || arr[start] > point) {
                    break;
                }
                start++;
            }
            int temp=arr[start];
            arr[start]=arr[end];
            arr[end]=temp;
        }
        arr[i]=arr[start];
        arr[start]=point;

        QuickSort(arr,i,start-1);
        QuickSort(arr,start+1,j);

    }


http://www.kler.cn/a/386105.html

相关文章:

  • SpringBoot - Async异步处理
  • 针对gitgitee的使用
  • 第12章 系统部署
  • 卷积神经网络之Yolo详解
  • 树莓派(Raspberry Pi)Pico 2 C_C++开发环境配置(Docker+SDK)
  • Springboot配置全局异常通用返回
  • React教程(详细版)
  • YOLO11改进-注意力-引入多尺度注意力聚合(MSAA)模块
  • 基于STM32的智能家居安防AI系统:OpenCV、TCP/HTTP、RFID、UART技术设计思路
  • 大模型微调技术 --> P-Tuning v1和 P-Tuning v2
  • 深度学习鲁棒性、公平性和泛化性的联系
  • Laravel 安全实践:如何防止 XSS 攻击
  • 网站访问在TCP/IP四层模型中的流程
  • 第01章 Linux概述及系统环境搭建
  • 基于SSM(Spring + Spring MVC + MyBatis)框架的咖啡馆管理系统
  • 测度论原创(三)
  • AOP基于注解的切面表达式
  • 【自然语言处理与大模型】大模型(LLM)基础知识②
  • Linux基础学习笔记
  • MySQL库操作
  • MAC 安装 brew及其常用命令
  • 十七:Spring Boot (2)-- spring-boot-starter-web 依赖详解
  • 论文略读:GRAG:GraphRetrieval-Augmented Generation
  • Windows10 上安装 Docker 失败
  • 苍穹外卖day09超出配送范围前端不提示问题
  • el-scrollbar 动态更新内容 鼠标滚轮无效