算法温习

2023华为OD面试手撕真题【最长公共前缀】 阅读详情

查找算法


二分查找

非常经典的查找算法,常用在已排序数组的查找上。
不过需要注意的还有几点:

  1. 注意代码鲁棒性:函数头判断low和high的合法性
  2. 求mid时,用 mid = low + (high - low) / 2 防止溢出
  3. 扩展:若含有重复数字,则可以返回第一次或最后一次出现的位置

代码示例:

public class BinarySearch {
    public static int binarySearch(int [] array, int des) throws Exception {
        if(array == null || array.length == 0)
            throw new Exception("Null Array!");
        int low = 0, high = array.length - 1;
        int mid = 0;
        while(high >= low) {
            mid = low + (high - low) / 2;
            if(array[mid] == des) {
                return mid;
            } else if(array[mid] > des) {
                high = mid - 1;
            } else {
                low = mid + 1;
            }
        }
        throw new Exception("No such des.");
    }
}

排序算法

经典的排序算法有:

  1. 插入排序
  2. 选择排序
  3. 冒泡排序
  4. 希尔排序(Shellsort)
  5. 归并排序
  6. 快速排序
  7. 堆排序

下面一一简单温习一遍:


插入排序

public class InsertionSort {
    public static void insertionSort(int [] array) {
        if(array == null || array.length == 0)
            return ;
        int j;
        for(int i = 1; i < array.length; i++) {
            int tmp = array[i];
            for(j = i; j > 0 && array[j - 1] > tmp; j--) {
                array[j] = array[j - 1];
            }
            array[j] = tmp;
        }
    }
}

选择排序

public class SelectSort {
    public static void selectSort(int [] array) {
        for(int i = 0; i < array.length - 1; i++) {
            int k = i;
            for(int j = k; j < array.length; j++) {
                if(array[j] < array[k]) {
                    k = j;
                }
            }
            if(k != i) {
                int tmp = array[k];
                array[k] = array[i];
                array[i] = tmp;
            }
        }
    }
}

冒泡排序

public class BubbleSort {
    public static void bubbleSort(int [] array) {
        for(int i = 0; i < array.length - 1; i++) {
            for(int j = 0; j < array.length - 1 - i; j++) {
                if(array[j] > array[j + 1]) {
                    int tmp = array[j];
                    array[j] = array[j + 1];
                    array[j + 1] = tmp;
                }
            }
        }
    }
}

希尔排序

希尔排序可以理解为: 对每隔gap长度的子数组进行插入排序操作,一道最后进行gap=1,即普通的插入排序操作。

public class ShellSort {
    public static void shellSort(int [] array) {
        int j;
        for(int gap = array.length / 2; gap > 0; gap /= 2) {
            for(int i = gap; i < array.length; i++) {
                int tmp = array[i];
                for(j = i; j >= gap && array[j - gap] > tmp; j -= gap) {
                    array[j] = array[j - gap];
                }
                array[j] = tmp;
            }
        }
    }
}

归并排序

归并排序应用了经典的分治策略(divide and conquer),算法细节不再赘述,不过要注意的是,在算法进行过程中,只需要一个与待排序数组同样大小的空间做缓冲区即可,所以在排序驱动代码中创建一个tmp数组,然后在子函数传参的时候把tmp与array同时传递即可。

public class MergeSort {
        public static void mergeSort(int[] array) throws Exception {
        if(array == null || array.length == 0) {
            throw new Exception("Null array!");
        }
        int[] tmp = new int[array.length];
        mergeSort(array, tmp, 0, array.length - 1);
    }

    public static void mergeSort(int[] array, int[] tmp, int left, int right) {
        int center = (left + right) / 2;
        if(left < right) {
            mergeSort(array, tmp, left, center);
            mergeSort(array, tmp, center + 1, right);
            merge(array, tmp, left, center + 1, right);
        }
    }

    public static void merge(int[] array, int[] tmp, int leftPos, int rightPos, int rightEnd) {
        int leftEnd = rightPos - 1;
        int tmpPos = leftPos;
        int length = rightEnd - leftPos + 1;
        while(leftPos <= leftEnd && rightPos <= rightEnd) {
            if(array[leftPos] > array[rightPos]) {
                tmp[tmpPos++] = array[rightPos++];
            } else {
                tmp[tmpPos++] = array[leftPos++];
            }
        }
        while(leftPos <= leftEnd) {
            tmp[tmpPos++] = array[leftPos++];
        }
        while(rightPos <= rightEnd) {
            tmp[tmpPos++] = array[rightPos++];
        }
        for(int i = 0; i < length; i++, rightEnd--) {
            array[rightEnd] = tmp[rightEnd];
        }
    }
}

快速排序

34、高效探索柔性蛋白质环构象空间的算法 本文介绍了一种高效探索柔性蛋白质环构象空间的算法,通过种子采样和变形采样两种技术,同时满足运动学闭合和避免空间位阻冲突的约束条件。种子采样能够在闭合无冲突构象空间中广泛生成构象,而变形采样则可以对“有趣”区域进行更密集的探索。实验结果表明,这两种方法在不同大小和受限程度的蛋白质环上均表现出色,运行时间在可接受范围内。相关算法已集成到工具包LoopTK中,可在https://simtk.org/home/looptk获取。 阅读详情

相关推荐

Unity Android构建报错:compileSdk 35兼容性五层定位法

Android构建中的compileSdk是编译时API目标版本,其升级并非孤立操作,而是触发JDK、Android Gradle Plugin(AGP)、NDK、targetSdk与Unity引擎版本之间强耦合校验的起点。当出现'using a newer Android Gradle plugin to use compileSdk = 35'类报错,本质是代际技术栈错配——例如AGP 7.1.3不识别compileSdk 35所需Java 17语法,或NDK 21与AGP 7.4的ABI规范冲突。该问

weixin_32496547的博客 569

温习基础算法之快速排序

快速排序 基于分治的思想,采取递归的方式处理子问题 伪代码 QUICKSORT(A,p,r) if p<r q = PARTITION(A,p,r) QUICKSORT(A,p,q-1) QUICKSORT(A,q+1,r); PARTITION(A,p,r) x = A[r] i = p-1 for j = p to r-1 if A[j] <= x i = i + 1 exchange A[r] with A[j] exchange A[i+1] wi

OneSeek的博客 246

手把手教你用Copilot插件在Obsidian里免费接入DeepSeek-R1(附硅基流动API密钥获取)

本文详细介绍了如何通过Copilot插件在Obsidian中免费接入DeepSeek-R1模型,实现智能知识管理。从硅基流动API密钥获取到插件配置,再到高级功能调优和实战应用技巧,手把手教你打造AI驱动的个人知识库。

weixin_33686714的博客 2801

所谓温故而知新,最近在温习算法,于是看到了位操作,发现位操作的功能实在太强大了,而且高效

www.sourcedev.cc点击打开链接

code 750

从气象预报到物流规划:多尺度地理加权回归(MGWR)在ArcGIS Pro中的实战应用

本文深入探讨了多尺度地理加权回归(MGWR)在ArcGIS Pro中的实战应用。通过对比传统GWR模型,MGWR的核心优势在于能识别不同解释变量的独特空间作用尺度,有效解决空间异质性问题。文章结合气象预报误差修正与物流网点选址两个案例,详细讲解了从数据准备、参数设置、带宽优化到结果解读的全流程,为地理数据分析师处理复杂空间数据提供了强大工具。

egg99的博客 1034

上海交大计算机保研面试 2026:3类专项计划与10个联培方向深度解析

本文深度解析2026年上海交通大学计算机保研面试的3类专项计划与10个联培方向,包括区块链技术、智能计算系统和网络安全专项,以及蚂蚁科技、苏州智研院等联培基地。文章详细介绍了各专项的核心课程、硬件资源和就业去向,为计算机专业学生提供全面的申请策略和职业发展建议。

weixin_31528001的博客 397

java 贪吃蛇碰撞检测_温习数据算法—贪吃蛇

前言很多朋友学习了计算机语言后都做过贪吃蛇的游戏(VB,C,C++,C#,JAVA,JQuery等),现在估计很多人都忘记怎么写了。我们现在用jquery+css来实现一个贪吃蛇的游戏效果。这里主要温习一下数据算法、游戏中面向对象和由局部到整体的思想。源码下载地址+演示地址效果图GIf设计思路第一步,构思编写出静态页面。第二步,让贪吃蛇动起来。第三步,通过键盘上下左右键去控制运动方向,空格键暂停。...

weixin_30786631的博客 895

基于EtherCAT的AM402与SV660N、IS620N伺服运动控制实战指南

本文详细介绍了基于EtherCAT总线的汇川AM402 PLC与SV660N、IS620N伺服驱动器构建运动控制系统的完整实战流程。内容涵盖硬件平台搭建、软件组态、关键参数设置、InoProShop编程及调试技巧,旨在帮助工程师快速掌握这一高精度、高响应的工业自动化解决方案。

weixin_29204205的博客 401

温习数据算法—贪吃蛇

前言 很多朋友学习了计算机语言后都做过贪吃蛇的游戏(VB,C,C++,C#,JAVA,JQuery等),现在估计很多人都忘记怎么写了。 我们现在用jquery+css来实现一个贪吃蛇的游戏效果。 这里主要温习一下数据算法、游戏中面向对象和由局部到整体的思想。 源码下载地址+演示地址 百度网盘源码下载地址: https://pan.baidu.com/s/1FGKVQfxgTJaPilKSRH0kDQ 提取码: sybv 在线演示地址:http://www.xiongze.net/snake/in

熊泽-学习中的苦与乐 263

GPU服务器维修全流程:从检测到解锁

《GPU服务器维修维保全流程指南》摘要:本文系统介绍GPU服务器从检测到解锁的完整维修流程。检测环节包含物理检查(氧化层、散热、PCB板)和电子诊断(ECC报错率、电源波动等);核心维修技术涵盖PCB板修复(微孔镀铜、BGA返修)和芯片级维修(成功率78-92%);解锁验证阶段包括性能解锁(VBIOS重写)和72小时稳定性测试。文末提供故障速查表及维保建议,强调定期除尘可降低38%故障率,推荐环境粉尘浓度控制在≤0.3mg/m³。

2401_89353317的博客 891

华为OD机试真题 新系统2026-04-01 Python&JS【计算数列位置N的值】

如果其前面的M个元素中,存在值相同的元素,则该位置上的数值等于前面M个数中最大的数值与最小的数值之如果其前面的M个元素中,不存在值相同的元素,则该位置上的数值等于前面M个数中最大的数值与最小的数值之差;1、输入M、N两个数,则按照以下规则形成一个数列;两个整数,用逗号分割,分别表示M和N。一个整数,表示数列第N个位置上的数值。2、数列的前M个元素的值为1到M;请计算该数列第N个位置上的数值。N取值范围:1<= N<=50。M取值范围:3<=M<=10。

MISAYAONE的博客 3242

温习kmp算法及修改

1.串匹配的朴素方式;     已知两个串,源 abcde  模式串 de ;     用3个指针, 开头匹配,然后分别 增加,直到全匹配为止;否则 移动 de。代码如下:   int brutal_force(char *s,char*t){ int slen= strlen(s); int tlen= strlen(t); int i = 0; while(i<slen-tlen

xshalk的专栏 1094

Android Audio音量——音频类型新增(九)

在实际开发中,经常会遇到需要新增一个音频类型(usage)的需求,这里我们简单介绍一下需要修改的代码。

小旭的专栏 1571

排序算法温习

一 排序时间复杂度总结 http://jpkc.glxy.sdu.edu.cn:9053/html/suanfayanlian/20080426/86.html母校的东西,很惊喜,数据结构基本算法的快速掌握 转载于:https://www.cnblogs.com/seven-wei/p/dwhr.html...

weixin_34023863的博客 154

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

算法之是温习与夯实(快排)

今天把知道很久的算法写一遍,发现还是有很多和想的不一样。虽然sort和qsort可以很好地满足日常需求。但是必要的基本知识还是得会自己写。如果不知道原理的可以看这篇博客:点击打开链接知道原理以后,搓代码就很简单了。主要是分治的思想。代码:void quick_sort(int target, int from , int to) { if(from&lt;to) { ...

qq_36616268的博客 144

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

几种常用排序算法温习

几种常用排序算法温习 一、 简单排序方法 1.直接插入排序 基本思想:顺序地将待排序的记录按其关键码的大小插入到已排序的记录子序列的适当位置。 算法代码: //直接插入排序 public static void InsertSort(SeqList&lt;int&gt; seq) { if (seq.IsEmpty() ...

weixin_33918357的博客 110

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

温习数据算法—罗盘时钟

前言 分享几款JS实现的在线罗盘时钟应用,代码简洁好摘,可以学习参考,可以应用到自己的项目里! 项目演示 罗盘时钟样式1 罗盘时钟样式2 罗盘时钟样式3 源码下载地址 罗盘时钟样式1: 百度网盘链接:https://pan.baidu.com/s/1V_AZw4M5jCIWKy91QDvN0A 提取码:xion 罗盘时钟样式2: 百度网盘链接:https://pan.baidu.com/s/1nqINmAQ6KkXVeZAprvpPSw 提取码:xion 罗盘时钟样式3: 百度网盘链接:

熊泽-学习中的苦与乐 1386

数据结构各种排序算法的温习

首先分门别类介绍各种算法的实现,最后汇总比较一下 排序算法 1.插入排序 直接插入排序 A[1…n],从i=2开始,一个一个找,找到A[i]在A[1…i-1]已排序好的位置排序 所以排n-1趟最好O(n),一般是O(n²) 折半插入排序 区别在于,找位置的时候用了二分法,但是注意查找快了,放入数据后的移动次数没有改变 所以还是O(n²) 希尔排序 区别在于每次分组进行直接插入排序,直到只分为一组。...

qq_36684096的博客 222

插入排序的算法温习

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> #include void printf_array(int *array,int len) {  int i=0;  for(i =

龙山三人团 482

冒泡排序算法的温习

自从大一第一次接触冒泡算法后,就一直没对这个问题搞懂。虽然考试考了很多次,但一直没有时间去一点点弄懂,每次考试,就背背代码。 趁着这次复习,终于可以一步一步的理解冒泡算法了。 1 #include "stdio.h" 2 3 void print(int r[], int n) 4 { 5 int i; 6 for(i = 0; i < n; ...

weixin_34406796的博客 92

算法温习——手撕快速排序

1、快速排序介绍 坐在马桶上看算法:快速排序 2、Java实现(个人实现。。) import org.junit.Test; public class QuickSortTest { public void quickSort(int[] array, int left, int right){ if (left>=right){ ...

qq_37771475的博客 262

几种排序算法温习

1、冒泡排序void GloabPopoSort(int a[],int nCount) { for (int i = 0;i<nCount;i++) { for (int j = i+1;j<nCount;j++) { if (a[i]>a[j]) { a[i]^=a[

481

python算法设计怎么写_Python算法设计(温习)

初级排序算法1.插入排序平均时间复杂度: , 空间复杂度: ,稳定的排序算法def Insert_sort(nums):for i in range(1,len(nums)):for j in range(i):if nums[j] > nums[i]:ins = nums[i]nums.pop(i)nums.insert(j,ins)breakprint(nums)将无序数组中的元素依次...

weixin_36042403的博客 746

温习《算法导论》的插入排序

有段时间没接触编程了,一些基本算法快忘光了,重拾《算法导论》,温习一下。下面是关于一个随机产生的10个100以内的整数插入排序的算法。  /*insertSort.c c语言编写  dev c++4.92编译通过 */ #include #include #ifndef _RAND_ARRY_H //构造十个随机数构成数组  #define  _RAND_ARRY_H #de

577

【Java版】温习 8 种排序算法

1.直接插入排序 经常碰到这样一类排序问题:把新的数据插入到已经排好的数据列中。 1.将第一个数和第二个数排序,然后构成一个有序序列 2.将第三个数插入进去,构成一个新的有序序列。 3.对第四个数、第五个数……直到最后一个数,重复第二步。 如何写写成代码: 1.首先设定插入次数,即循环次数,for(int i=1;i<length;i++),1个数的那次不用插入。 2.设定插入数和得到已经排好序列的最后一个数的位数。insertNum和j=i-1。 3.从最后一个数开始向前循环,如果插入数小于当

150
上一篇: Spring MVC
下一篇: 【设计模式】纲要
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值