zoukankan      html  css  js  c++  java
  • 面试常用算法整理

    知识点:基本算法 algorithms

    1.线性查找

    2.二分查找

    描述:在数组中查找指定数值

          首先要求该组元素必须是有序的,假设默认是从小到大排列,使用该组元素的中间元素与目标元素进行比较,如果相等则查找成功,如果中间元素比目标元素小,则去中间元素的右侧查找(递归),如果中间元素比目标元素大,则去中间元素的左侧查找(递归),直到找到目标元素 或者比较完毕,表示查找失败。

    int a={3,6,7,9,16,28,32}

    伪代码:

    // 注意: 使用二分查找算法的前提是数组元素必须有序

    public static void main(String[] args) {

        int a={3,6,7,9,16,28,32}

        int n=a.length;
        SearchBinary(a,16,0,n);
    }

    public static int SearchBinary(int a[ ],int value,int left,int right){

          if(left<=right){

           int mid=(left+right)/2;

           tempValue=a[mid];

             // 和中间元素比较,如果相等,查找成功

              if(tempValue==value){

                 return  mid;

              }

             // 如果小于中间元素,去左边找

              else if(tempValue>value){

                 return SearchBinary(a,value,left,mid-1);

               }

             // 如果大于中间元素,去右边找

              else if(tempValue<value){

                 return SearchBinary(a,value,mid+1,right);

               }

         }

        //比较完毕

        return -1;

    }

    3.冒泡排序

    int [] a = {10,4,7,3,9}; n=a.length;

    <!--

    数据举例demo

    第一趟:: 4 7 3 9 10 交换 4次(5-1)

    第二趟 :4 3 7 9 10  交换 3 次(5-2)

    。。。

     第i趟:                   交换 n-i 次 (n-i)

    -->

    伪代码:

    //n-1趟

    for(int i=1;i<=n-1;i++){

       //n-i次(i趟对应的次数)

       for(int j=0;j<n-i;j++){

         if(a[j]>a[j+1]){

           //两瓶水交换,借助第三个瓶子为媒介

           int tempcontainer=a[j];

           a[j]=a[j+1];

           a[j+1]=tempcontainer;

        }

     }

    }

    4.插入排序   (把n个待排序的元素看成一个有序表和一个无序表,开始时有序表中只有一个元素,无序表中有n-1个元素;排序过程即每次从无序表中取出第一个元素,将它插入到有序表中,使之成为新的有序表,重复n-1次完成整个排序过程。)

    int [] a={3,1,5,23,2,4};n=a.length;

    <!--

    数据举例demo

    第一趟:  1,3,5,23,2,4 

    第二趟:  1,3,5,23,2,4

    。。。    

    第 i 趟 :

    -->

    伪代码:(详细思路代码,可参考https://www.cnblogs.com/snowcan/p/6244128.html)

    //n-1趟循环

    for (int i=1;i<n;i++){

        //tempcontainer存放本轮插入有序列表中的数

         int tempcontainer=a[i];

         //判断tempcontainer要插入的位置

        for(int j=i-1;j>=0&&a[j]>tempcontainer;j--){

            //将第j上的元素,朝后移动

            a[j+1]=a[j];

         }

       //将tempcontainer,插入到空出来的位置上

        a[j+1]=tempcontainer; //到这里,之前for循环,j位置的元素已经移到j+1的位置上了,j--位置的元素如果不满足条件,跳出循环,此时要想在j的空位置上赋值,

        //必须a[j+1],因为在跳出循环之前j--了

    }

    5.简单选择排序(基本思想:给定数组 int[] arr={里面n个数据};第1趟排序,在待排序数据arr[0]~arr[n-1]中选出最小的数据,将它与arrr[0]交换;第2趟,在待排序数据arr[1]~arr[n-1]中选出最小的数据,将它与r[1]交换;以此类推,第i趟在待排序数据arr[i-1]~arr[n-1中选出最小的数据,将它与r[i-1]交换,直到全部排序完成

    int [] a={3,1,5,23,2,4};n=a.length;

    <!--

    数据举例demo

    第一趟:  1,3,5,23,2,4 

    第二趟:  1,2,5,23,3,4

    。。。    

    第 i 趟 :

    -->

    伪代码:(详细思路代码,可参考https://www.cnblogs.com/shen-hua/p/5424059.html)

       //n-1趟循环

     for(int i=0;i<n-1;i++){

       int min=i; //第i趟最小值,下标用min来记录

        for(int j=min+1;j<n;j++){ //选择最小记录

           if(a[j]<a[min]){

              min=j;//记下当前找到的最小值所在的位置

             }

         }

         //内层循环结束后,已经找到了本轮循环的最小数,再进行交换

        if(i  !=min){//如果i下标的位置,不是最小值的话(min=i的情况),则交换a[i]和a[min]

           int temp=a[i];

           a[i]=a[min];

           a[min]=temp;

         }

    }

    6.n层汉诺塔问题

     (知识点参考知乎:https://www.zhihu.com/question/24385418)

      (伪代码参考https://www.cnblogs.com/gw811/archive/2012/10/10/2719181.html)

    描述:

    图片动画演示

    三维动画演示可查看:https://hightopo.com/demo/hanoi_20151106/index.html

    伪代码:

    public class Hanoi {

    public static void move(int n,String from,String temp,String to){
    if(n>0){
    move(n-1,from,to,temp);
    System.out.println("盘"+n+"由"+from+"移到"+to);
    move(n-1,temp,from,to);
    }
    }

    public static void main(String[] args) {
    move(3,"A","B","C");
    }

    }

    输出结果:

    以上是伪代码,详细代码参考

    博客:https://www.cnblogs.com/Ray1024/p/10337144.html

    补充:关于其他经典排序算法(希尔排序、快速排序、归并排序、堆排序、基数排序等) 可以参考 https://www.cnblogs.com/fivestudy/p/10212306.html

  • 相关阅读:
    什么是动态链接库
    <<TCP/IP高效编程>>读书笔记
    C++ 函数
    我的vim配置
    FastReport4.6程序员手册_翻译
    DUnit研究初步
    ADO BUG之'无法为更新定位行....' 解决之道
    极限编程的集成测试工具Dunit
    总结
    项目管理检查清单项目启动
  • 原文地址:https://www.cnblogs.com/shuaifing/p/10338927.html
Copyright © 2011-2022 走看看