jjzjj

50.【算法图解】

吉士先生 2023-12-18 原文

算法图解

(一)、二分查找O(log n)

1.使用二分查找的条件

二分查找目的是为了能够快速的遍历数据,然后能够得到我们想要的数据.查找的次数最多为:log2的n次方;相比原来的数据要减少很多复杂度.切记使用二分查找的前提是这个数据是有序的不能乱序,乱序就完蛋.

2.基本思路;

就是使目标值和中间值进行判断,假如说中间值大于目标值,那么就使hight=mid-1;如果中间值小于目标值那么就使low=mid+1;继续进行判断直到目标值和中间值相等为止.

3.代码展示:

import java.util.Scanner; public class hello {
    public static void main(String[] avgs) {
        int[] arr_number = new int[50];
        Scanner sc = new Scanner(System.in);

        for (int i = 0,j=1; i < arr_number.length; i++,j++) {
            arr_number[i] = j;
        }
        for (int i = 0; i < arr_number.length; i++) {
            System.out.println(arr_number[i]);
        }
        int hight = arr_number.length - 1;
        int low = 0;
        int mid,idex=0;

        System.out.println("请输入你要查找的数据是:");
        int airNumber = sc.nextInt();
        while (low <= hight) {
               mid = (hight + low) / 2;
            if (arr_number[mid] < airNumber) {  //假如说中间值比目标值要小
                low = mid + 1;    //最低值为中间值+1;因为中间值已经计算过一遍了,再计算会增加
            }
            if (arr_number[mid] > airNumber) {
                hight = mid - 1;
            }
            if (arr_number[mid] == airNumber) {
                idex=mid;
                break;
            }
        }
        System.out.println("目标数字的坐标是:" + idex);
    } }

4.时间复杂度是:O(log n);

(二)、冒泡排序(右)

1.什么是冒泡排序?

冒泡排序的英文Bubble Sort,是一种最基础的交换排序。之所以叫做冒泡排序,因为每一个元素都可以像小气泡一样,根据自身大小一点一点向数组的一侧移动。

2.冒泡排序原理:

每一趟只能确定将一个数归位。即第一趟只能确定将末位上的数归位,第二趟只能将倒数第 2 位上的数归位,依次类推下去。如果有 n 个数进行排序,只需将 n-1 个数归位,也就是要进行 n-1 趟操作。

而 “每一趟 ” 都需要从第一位开始进行相邻的两个数的比较,将较大的数放后面,比较完毕之后向后挪一位继续比较下面两个相邻的两个数大小关系,重复此步骤,直到最后一个还没归位的数。

3.冒泡排序的优缺点

根据复杂度的规则,去掉低阶项(也就是 n/2),并去掉常数系数,那复杂度就是 O(n^2)了;(高)

冒泡排序也是一种稳定排序,因为在两个数交换的时候,如果两个数相同,那么它们并不会因为算法中哪条语句相互交换位置。

4.代码展示:

import java.util.*;
public class hello {
    public static void main(String[] avgs) {
        Scanner sc=new Scanner(System.in);
    int []arr=new int[5];
    for(int i=0;i<arr.length;i++)
    {
        System.out.println("请您呼入第"+(i+1)+"个数子为:");
        arr[i]=sc.nextInt();
    }
    for(int i=0;i< arr.length;i++)
    {
        for(int k=0;k<arr.length-1-i;k++)  //排序到最右边
        {
            if(arr[k]>arr[k+1])    //进行交换
            {
                int temp;
                temp=arr[k];
                arr[k]=arr[k+1];
                arr[k+1]=temp;
            }
        }
    }
    System.out.println("从小到大的排序是:");
    for(int i=0;i<arr.length;i++)
    {
        System.out.print(arr[i]);
    }
    }
}

5.时间复杂度为: O(n^2)

(三)、选择排序(左)

1.什么是选择排序?

选择排序是一种简单直观的排序算法,它的工作原理是每一次从待排序的数据元素中选出最小(最大)的一个元素,存放在序列的开始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的后一个位置*。以此类推,直到全部待排序的数据元素排完。

2.选择排序原理

基本思想:每一趟从待排序的数据元素中选择最小(或最大)的一个元素作为首元素,直到所有元素排完为止。

3.选择排序优缺点

选择排序是不稳定的排序方法。

4.代码展示:

import java.util.*;
public class hello {
    public static void main(String[] avgs) {
        Scanner sc = new Scanner(System.in);
        int[] arr = new int[5];
        for (int i = 0; i < arr.length; i++) {
            System.out.println("请您呼入第" + (i + 1) + "个数子为:");
            arr[i] = sc.nextInt();
        }
        for (int i = 0; i < arr.length; i++) {
            int min = i;     //假设最小值的下标是:
            for (int k = i + 1; k < arr.length; k++) {
                if (arr[min] > arr[k]) {//假如说min大于k,那么两个人的坐标就要切换
                    min = k;
                }
            }
            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.print(arr[i]+" ");
        }
    }
}

5.时间复杂度: O(n^2)

(四)、直接插入排序

1.什么是直接插入排序?

直接插入排序的定义就是:在一个已经排好的有序表中,从而得到一个新的,记录数增1的有序表

2.排序原理:

直接插入的基本操作是将一个记录插入到已经排好序的有序表中,从而得到一个新的。记录数增1的有序表。首先和右边的数字进行比较,假如满足条件,那么就设置一个临时数组,然后进行for循环,进行移动位置,直到不满足为止,然后进行交换.

3.代码展示:

import java.util.*;
public class hello {
    public static void main(String[] avgs) {
        int[] arr = {1, 5, 2, 6, 8};
        InsertData(arr);
    }
    public static void InsertData(int[] arr) {
        int temp;     //设置临时空间
        int j;
        for (int i = 1; i < arr.length; i++) {    //因为我们要从第二个判断是否有序啊
            if (arr[i] < arr[i - 1]) {//假如说后一个小于前一个,那么就进入循环体
                temp = arr[i];    //把后一个的空间腾出来
                for (j = i - 1; j>=0&&temp < arr[j]; j--) {  //假如说右边小于左边的,换位置
                    arr[j + 1] = arr[j];
                }
                arr[j + 1] = temp;  //最后把最小的值放到后移后的位置
            }
        }
        for(int k=0;k<arr.length;k++)//开始遍历
        {
            System.out.println(arr[k]);
        }
    }
}

4.时间复杂度为: O(n^2)

(五)、事前评估运行时间:

import java.util.*;
import java.awt.*;
public class hello {
    public static void main(String []avgs)
    {
        long satrt=System.currentTimeMillis();   //函数
        System.out.println("请您输入一个整数:");
        Scanner sc=new Scanner(System.in);
        int number=sc.nextInt();
        System.out.println(number);
        long end=System.currentTimeMillis();
        float time=(float)(end-satrt)/1000; //函数
        System.out.println("运行时间是:"+time);
    }
}


会有一定的误差,比较不适合推荐使用!!!!

有关50.【算法图解】的更多相关文章

  1. 区块链之加解密算法&数字证书 - 2

    目录一.加解密算法数字签名对称加密DES(DataEncryptionStandard)3DES(TripleDES)AES(AdvancedEncryptionStandard)RSA加密法DSA(DigitalSignatureAlgorithm)ECC(EllipticCurvesCryptography)非对称加密签名与加密过程非对称加密的应用对称加密与非对称加密的结合二.数字证书图解一.加解密算法加密简单而言就是通过一种算法将明文信息转换成密文信息,信息的的接收方能够通过密钥对密文信息进行解密获得明文信息的过程。根据加解密的密钥是否相同,算法可以分为对称加密、非对称加密、对称加密和非

  2. 100个python算法超详细讲解:画直线 - 2

    1.问题描述使用Python的turtle(海龟绘图)模块提供的函数绘制直线。2.问题分析一幅复杂的图形通常都可以由点、直线、三角形、矩形、平行四边形、圆、椭圆和圆弧等基本图形组成。其中的三角形、矩形、平行四边形又可以由直线组成,而直线又是由两个点确定的。我们使用Python的turtle模块所提供的函数来绘制直线。在使用之前我们先介绍一下turtle模块的相关知识点。turtle模块提供面向对象和面向过程两种形式的海龟绘图基本组件。面向对象的接口类如下:1)TurtleScreen类:定义图形窗口作为绘图海龟的运动场。它的构造器需要一个tkinter.Canvas或ScrolledCanva

  3. ruby - 在 Ruby 中实现 Luhn 算法 - 2

    我一直在尝试用Ruby实现Luhn算法。我一直在执行以下步骤:该公式根据其包含的校验位验证数字,该校验位通常附加到部分帐号以生成完整帐号。此帐号必须通过以下测试:从最右边的校验位开始向左移动,每第二个数字的值加倍。将乘积的数字(例如,10=1+0=1、14=1+4=5)与原始数字的未加倍数字相加。如果总模10等于0(如果总和以零结尾),则根据Luhn公式该数字有效;否则无效。http://en.wikipedia.org/wiki/Luhn_algorithm这是我想出的:defvalidCreditCard(cardNumber)sum=0nums=cardNumber.to_s.s

  4. Ruby 斐波那契算法 - 2

    下面是我写的一个计算斐波那契数列中的值的方法:deffib(n)ifn==0return0endifn==1return1endifn>=2returnfib(n-1)+(fib(n-2))endend它工作到n=14,但在那之后我收到一条消息说程序响应时间太长(我正在使用repl.it)。有人知道为什么会这样吗? 最佳答案 Naivefibonacci进行了大量的重复计算-在fib(14)fib(4)中计算了很多次。您可以将内存添加到您的算法中以使其更快:deffib(n,memo={})ifn==0||n==1returnnen

  5. ruby-on-rails - Rails add_index 算法 : :concurrently still causes database lock up during migration - 2

    为了防止在迁移到生产站点期间出现数据库事务错误,我们遵循了https://github.com/LendingHome/zero_downtime_migrations中列出的建议。(具体由https://robots.thoughtbot.com/how-to-create-postgres-indexes-concurrently-in概述),但在特别大的表上创建索引期间,即使是索引创建的“并发”方法也会锁定表并导致该表上的任何ActiveRecord创建或更新导致各自的事务失败有PG::InFailedSqlTransaction异常。下面是我们运行Rails4.2(使用Acti

  6. ruby - 趋势算法 - 2

    我正在开发一个类似微论坛的项目,其中一个特殊用户发布一条快速(接近推文大小)的主题消息,订阅者可以用他们自己的类似大小的消息来响应。直截了当,没有任何形式的“挖掘”或投票,只是每个主题消息的响应按时间顺序排列。但预计会有很高的流量。我们想根据它们引起的响应嗡嗡声来标记主题消息,使用0到10的等级。在谷歌上搜索了一段时间的趋势算法和开源社区应用示例,到目前为止已经收集到两个有趣的引用资料,但我还没有完全理解它们:Understandingalgorithmsformeasuringtrends,关于使用基线趋势算法比较维基百科页面浏览量的讨论,在SO上。TheBritneySpearsP

  7. Ruby - 不支持的密码算法 (AES-256-GCM) - 2

    我收到错误:unsupportedcipheralgorithm(AES-256-GCM)(RuntimeError)但我似乎具备所有要求:ruby版本:$ruby--versionruby2.1.2p95OpenSSL会列出gcm:$opensslenc-help2>&1|grepgcm-aes-128-ecb-aes-128-gcm-aes-128-ofb-aes-192-ecb-aes-192-gcm-aes-192-ofb-aes-256-ecb-aes-256-gcm-aes-256-ofbRuby解释器:$irb2.1.2:001>require'openssl';puts

  8. java实现Dijkstra算法 - 2

    文章目录一.Dijkstra算法想解决的问题二.Dijkstra算法理论三.java代码实现一.Dijkstra算法想解决的问题解决的问题:求解单源最短路径,即各个节点到达源点的最短路径或权值考察其他所有节点到源点的最短路径和长度局限性:无法解决权值为负数的情况二.Dijkstra算法理论参数:S记录当前已经处理过的源点到最短节点U记录还未处理的节点dist[]记录各个节点到起始节点的最短权值path[]记录各个节点的上一级节点(用来联系该节点到起始节点的路径)Dijkstra算法步骤:(1)初始化:顶点集S:节点A到自已的最短路径长度为0。只包含源点,即S={A}顶点集U:包含除A外的其他顶

  9. 对于体育新闻中文文本关键字提取有哪些关键字提取算法及其步骤 - 2

    对于体育新闻中文文本的关键字提取,常用的算法包括TF-IDF、TextRank和LDA等。它们的基本步骤如下:1.TF-IDF算法: -将文本进行分词和词性标注处理。-统计每个词在文本中的词频(TF)。-计算每个词在整个语料库中出现的文档频率(DF)和逆文档频率(IDF)。-计算每个词的TF-IDF值,并按照值的大小进行排序,选择排名前几的词作为关键字。2.TextRank算法:-将文本进行分词和词性标注处理。-将分词结果转化成图模型,每个词语为节点,根据词语之间的共现关系建立边。-对图模型进行迭代计算,计算每个节点的PageRank值,表示该节点的重要性。-选择排名前几的节点作为关键字。3.

  10. arrays - ruby 中的最佳排列计数算法 - 2

    我正在尝试计算由二进制形式的1和0的P数表示的数字的数量。如果P=2,则表示的数字为0011、1100、0110、0101、1001、1010,所以计数为6。我试过:[0,0,1,1].permutation.to_a.uniq但这不是大数的最佳解决方案(P可以什么可能是最好的排列技术,或者我们是否有任何直接的数学来做到这一点? 最佳答案 Numberofpermutationcanbecalculatedusingfactorial.a=[0,0,1,1](1..a.size).inject(:*)#=>4!=>24要计算重复项,

随机推荐